删除ArrayList中的“”元素

时间:2011-03-01 09:26:17

标签: c#

我有这个arraylist:

ArrayList ftd = new ArrayList();
ftd.Add(new string[]{ "foo1.txt", "01.01.2011" });
ftd.Add(new string[]{ "foo2.txt", "04.01.2011" });
ftd.Add(new string[]{ "foo3.txt", "09.01.2011" });

并且在一些逻辑之后,arraylist看起来像这样:

[0] = { "foo1.txt", "01.01.2011" }
[1] = { "", "04.01.2011" }
[2] = { "foo3.txt", "09.01.2011" }

现在:我如何循环通过ftd并删除元素,首先var是“?”?

7 个答案:

答案 0 :(得分:5)

尝试使用:

var result = ftd.Cast<string[]>().Where(x => x[0] != "");

答案 1 :(得分:4)

尝试类似:

var filteredFtd = ftd.Cast<string[]>().Where(a => false == a[0].Equals(""));

如果您不想在原地更改ftd。

如果您确实想要更改它,可以按照其他答案中的建议使用RemoveAll。

BTW :我会使用System.Collections.Generic中的List< T >来代替。类型安全可以经常使您免于愚蠢的错误,并且还消除了转换为神奇类型的要求(您必须记住正确的类型,否则您将遇到运行时异常)。代码类似于:

var ftd = new List<string[]>();
ftd.Add(new string[]{ "foo1.txt", "01.01.2011" });
ftd.Add(new string[]{ "foo2.txt", "04.01.2011" });
ftd.Add(new string[]{ "foo3.txt", "09.01.2011" });

var filteredFtd = ftd.Where(a => false == a[0].Equals(""));

答案 2 :(得分:2)

您可以尝试使用LINQ修改列表:

var results = from string[] s in ftd
              where s[0] != ""
              select s;
ftd = new ArrayList(results.ToList());

答案 3 :(得分:1)

这两个示例都会从列表中删除项目,而不会复制列表。

我也更喜欢使用string.IsNullOrEmpty进行检查。它使您的代码更加清晰,并检查可能的null

我首选的方法:如果你可以使用List<string[]>,你可以使用:

var ftd = new List<string[]>();
// Logic to fill & handle

// To remove
ftd.RemoveAll(a => string.IsNullOrEmpty(a[0]));

你会更安全。

如果无法更改类型。您可以使用计数器遍历列表,而不是使用迭代器(foreach):

for(int i = 0; i < ftd.Count; i++) {
   if (string.IsNullOrEmpty(arr[0])) {
      ftd.RemoveAt(i);
      i--; // Adjust for One less
   }
}

答案 4 :(得分:0)

如果您使用的是非LINQ方法,则可以选择循环并将所有其他元素复制到新列表中:

ArrayList ftd2 = new ArrayList();

foreach(object element in ftd)
{
    string [] str = (string[])element;
    if(str[0] != "")
        ftd2.add(str);
}

这样的事情。未经测试的代码,但你应该明白这一点。

答案 5 :(得分:0)

我会选择像

这样的东西
    static void Main(string[] args)
    {
        ArrayList ftd = new ArrayList();
        ftd.Add(new string[] { "foo1.txt", "01.01.2011" });
        ftd.Add(new string[] { "", "04.01.2011" });
        ftd.Add(new string[] { "foo3.txt", "09.01.2011" });

        var result = ftd.Cast<string[]>().Where(x => !string.IsNullOrWhiteSpace(x[0]));
    }

答案 6 :(得分:-2)

试试吧

ArrayList ftd = new ArrayList();

    ftd.Add(new string[] { "foo1.txt", "01.01.2011" });

    ftd.Add(new string[] { "", "04.01.2011" });

    ftd.Add(new string[] { "foo3.txt", "09.01.2011" });

    ArrayList ftd1 = new ArrayList();

    foreach (object str in ftd)
    {
        string[] arr =(string[]) str;
        if (!arr[0].Split(',')[0].Equals(""))
        {
            ftd1.Add(str);
        }              
    }