2011-03-01 91 views
1

我有这样的ArrayList:在一个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" } 

NOW:我如何环路直通FTD和删除那里的元素第一个变量是“”?

+0

如果你在arraylist中使用每个数组的长度变量,你可以比较长度和数组的长度等于1的位置,你可以删除它。 – 2011-03-01 09:30:49

+0

请注意,将日期存储为字符串总是不好的做法。 – Bazzz 2011-03-01 10:00:03

回答

5

尝试:

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

它不会从列表中删除元素,这会创建没有某​​些元素的列表副本。 – GvS 2011-03-01 09:50:38

+0

@GvS:对,你是。我在“使用相同的实例”的含义中解释“删除”不是字面意思。 – 2011-03-01 09:53:04

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("")); 
+0

将无法​​工作,因为ArrayList是无类型的。 – 2011-03-01 09:30:48

+0

只是好奇,为什么你使用'false == expr'而不是'!expr'? – 2011-03-01 09:31:19

+0

丹尼尔,谢谢,修正。 – sinelaw 2011-03-01 09:31:48

0

如果你是一个非LINQ方法之后,一个选择是将循环通过它和其他所有元素复制到一个新的列表:

ArrayList ftd2 = new ArrayList(); 

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

就是这样的。未经测试的代码,但你应该明白。

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 
    } 
} 
2

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

var results = from string[] s in ftd 
       where s[0] != "" 
       select s; 
ftd = new ArrayList(results.ToList()); 
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])); 
    } 
-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); 
     }    
    } 
+0

'Split'没有任何意义。 – 2011-03-01 09:51:20