2013-05-03 74 views
1

我正在寻找一种方便的方式来删除空字符串作为它们的值的列表项目。方便的方法从集合中删除空字符串

我知道我可以检查每个字符串,以查看它是否为空之前加载到列表中。

List<string> items = new List<string>(); 
if (!string.IsNullOrEmpty(someString)) 
{ 
    items.Add(someString); 
} 

但是,这似乎有点麻烦,特别是如果我有很多字符串添加到列表中。

或者,我可以加载的所有字符串无论是空或不:

List<string> items = new List<string>(); 
items.Add("one"); 
items.Add(""); 
items.Add("two") 

然后遍历列表,如果一个空字符串被发现将其删除。

foreach (string item in items) 
{ 
    if (string.IsNullOrEmpty(item)) 
    { 
     items.Remove(item); 
    }    
} 

这些是我唯一的两个选择,也许Linq有一些东西吗?

感谢您的任何帮助。

+2

为什么在添加之前检查空字符串会很麻烦?如果你正在创建这个列表,那么你完全可以控制进入它的内容 - 为什么要在事实之后进行过滤? – 2013-05-03 13:21:47

+0

之后删除空元素的麻烦是'.Remove'强制复制要删除的元素后面的所有元素,并向下移动一个索引位置。所以,有很多字符串,你最好创建一个没有这些空元素的新列表。但是,为什么不应该留下那些空的元素呢? – JeffRSon 2013-05-03 13:38:38

+0

@ChrisMcAtackney所以,我会得到这样的事情: if(!string.IsNullOrEmpty(string1)) items.Add(string1); if(!string.IsNullOrEmpty(string2)) items.Add(string2); if(!string.IsNullOrEmpty(string3)) items.Add(string3); 还是有更优美的方式我失踪? – Baxter 2013-05-03 13:41:26

回答

5

尝试:

items.RemoveAll(s => string.IsNullOrEmpty(s)); 

,也可以使用where筛选出来:

var noEmptyStrings = items.Where(s => !string.IsNullOrEmpty(s)); 
+3

你甚至可以在这种情况下删除lambda语法,因为类型已经匹配:'items.RemoveAll(String.IsNullOrEmpty);' – 2013-05-03 13:22:16

1

进行了扩展,达伦的答案,你可以使用一个扩展方法:

/// <summary> 
    /// Returns the provided collection of strings without any empty strings. 
    /// </summary> 
    /// <param name="items">The collection to filter</param> 
    /// <returns>The collection without any empty strings.</returns> 
    public static IEnumerable<string> RemoveEmpty(this IEnumerable<string> items) 
    { 
     return items.Where(i => !String.IsNullOrEmpty(i)); 
    } 

而且然后用法:

 List<string> items = new List<string>(); 
     items.Add("Foo"); 
     items.Add(""); 
     items.Add("Bar"); 

     var nonEmpty = items.RemoveEmpty(); 
1

在将字符串添加到列表之前检查字符串总是比从列表中删除它们或创建一个全新的字符串要麻烦。你试图避免字符串比较(实际检查它的空白,执行速度非常快)并将其替换为列表复制,这会对应用程序的性能产生很大影响。如果您只能在将字符串添加到列表之前检查字符串 - 请这样做,并且不要混合。

+1

好点但是如果集合的创建是由不在你控制之下的代码完成的呢? – 2013-05-03 13:35:15

+0

当然,如果他无法控制将项目添加到列表中,他应该使用上面提出的方法,但请阅读我的最后一句。另外 - 他说他可以在将字符串添加到列表之前检查字符串,但不想,因为它“很麻烦”。 – Tarec 2013-05-03 13:49:36

+0

@Tarec你会使用类似这样的东西:http://pastebin.com/A5cBraQL还是有更好的方式来检查之前添加? (我不能让列表变成一个类变量) – Baxter 2013-05-03 14:11:51