题 从字符串数组中删除所有空元素


我有这个:

List<string> s = new List<string>{"", "a", "", "b", "", "c"};

我想删除所有空元素 ("") 从它快速(可能通过LINQ)而不使用 foreach 声明,因为这使代码看起来很难看。


35
2018-01-13 22:43


起源


几乎重复: 如何从通用列表中删除“空”项? - Mark Hurd
顺便说一下,那不是 string 数组但是列表。 - Tim Schmelter


答案:


您可以使用 List.RemoveAll

C#

s.RemoveAll(str => String.IsNullOrEmpty(str));

VB.NET

s.RemoveAll(Function(str) String.IsNullOrEmpty(str))

58
2018-01-13 22:45



我只想写 s.RemoveAll(String.IsNullOrEmpty);,在这种情况下你不需要lambda。 - Paolo Moretti
@PaoloMoretti:+1好点。但至少在VB.NET中它并不是真的更短: s.RemoveAll(AddressOf String.IsNullOrEmpty) 并且lamdba表明可以轻松修改它。 Imho使用lambda更具可读性。 - Tim Schmelter
为什么它返回已删除元素的数量而不是清除列表?这个 int count = s.RemoveAll(string.IsNullOrEmpty); 是有效的但是 List<string> list = s.RemoveAll(string.IsNullOrEmpty); 不。 - Jan Chalupa
因为使用删除的元素创建新列表将比简单地返回已删除元素的数量更昂贵。请注意,该方法应仅删除元素,并且返回值只是可以提供的信息,因为它已经可用。如果需要获取匹配元素列表,请查看List.FindAll。 - Tim Schmelter


退房 List.RemoveAll 同 String.IsNullOrEmpty() 方法;

指示指定的字符串是null还是空字符串。

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

这里有一个 DEMO


11
2018-01-13 22:46



+1为小写“s”为 string :) - nawfal
不。 OP使用了两个:)只是个人喜好.. :) - nawfal


s = s.Where(val => !string.IsNullOrEmpty(val)).ToList();

10
2018-01-13 22:46



这应该是s = s.Where(val =>!string.IsNullOrEmpty(val))。ToList();他的初始类型是 List<string> 所以你需要确保它保持不变 List<string> - MethodMan
这种方式可能适用于IList。 IList没有RemoveAll。 - liang