从字符串列表的列表中删除空条目。

3
我正在寻找一种更高效的方法来从一个字符串列表的列表中删除空字符串值。
下面的代码可以工作,但是对于非常大的数据集来说,这似乎是低效的。 是否有更有效的方法可以做到这一点? 注意 - 开头只是构建数据集,以便拥有包含空字符串的列表
public static void Main()
{       
    //Building the data set
    List<List<string>> list = new List<List<string>>();
    list.Add(new List<string> {"One", "Two", "", "Eight"});
    list.Add(new List<string> {"Three", "Five", "Six"});
    list.Add(new List<string> {"Sixteen", "", ""});
    list.Add(new List<string> {"Twenty-Eight", "Forty", "Nine"});

    //Create an empty List of a List
    List<List<string>> newList = new List<List<string>>();

    //Loop through the original list and purge each list of empty strings
    for(int i = 0; i < list.Count; i++) {
        newList.Add(list[i].Where(x => !string.IsNullOrEmpty(x)).ToList());
    }

    foreach (var s in newList) {
        Console.WriteLine(string.Join(", ", s));    
    }

    /*
    CORRECT OUTPUT:
        "One", "Two", "Eight"
        "Three", "Five", "Six"
        "Sixteen"
        "Twenty-Eight", "Forty", "Nine"         
    */      
}

由于它们是列表,您可以使用 List.RemoveAll(),这样您就不需要创建新的列表来替换当前的列表。 - Jeff Mercado
列表(Lists)是可变的(mutable);你想要改变现有的列表,还是创建新的列表?两种选择都是合理的。 - Eric Lippert
你说你担心“效率”,但是效率是产生的价值除以消耗的资源; 你正在产生什么价值,又在消耗什么资源呢? - Eric Lippert
好问题。我想简单地删除每个子列表中的空字符串。 - bagofmilk
2
如果您想要删除所有的内容,恰当命名的 RemoveAll 方法应该是您的首选。 - Eric Lippert
4个回答

15
为什么不使用List<T>.RemoveAll()方法?该方法定义如下:

按照指定的谓词条件,移除所有与之匹配的元素。

foreach (var l in list)
{
    l.RemoveAll(x => string.IsNullOrEmpty(x));
}

这就是你所需要的。其他答案中使用了Select().Where()两次ToList(),这对于像这样简单的操作来说开销太大了。


有趣...你认为这比上面的一行LINQ语句更快? - bagofmilk
2
@bagofmilk 速度差异不会太大,但这种方法在内存方面消耗要少得多,因为它不需要创建新的列表。 - juharr
1
@bagofmilk: 到底哪个更快其实并不重要,除非这个特定的任务在你的应用中代表了性能瓶颈。更重要的是Abbas的代码更易读。就个人而言,我更喜欢使用方法组(l.RemoveAll(string.IsNullOrEmpty);)而不是lambda表达式(适用于你的问题大部分答案)。我会注意到,如果您坚持要一个一行代码,您仍然不需要使用LINQ:只需使用(list.ForEach(x=>x.RemoveAll(String.IsNullOrEmpty)))即可。虽然就个人而言,我不是List<T>.ForEach的粉丝。 - Brian

2

如果你想返回一个List<List<string>>,那么只需使用Select并使用Where筛选内部列表即可。

public List<List<string>> FilterStrings()
{
    List<List<string>> list = new List<List<string>>();
    list.Add(new List<string> { "One", "Two", "", "Eight" });
    list.Add(new List<string> { "Three", "Five", "Six" });
    list.Add(new List<string> { "Sixteen", "", "" });
    list.Add(new List<string> { "Twenty-Eight", "Forty", "Nine" });

    return list.Select(lst => lst.Where(str => !string.IsNullOrEmpty(str)).ToList()).ToList();
}

1
newList = list.Select(t=>t.Where(q=>!string.IsNullOrEmpty(q)).ToList()).ToList();

0
主要思路:遍历列表并从每个列表中删除空字符串。 < p > < code > list.Select(outerListItem => outerListItem.Where(innerListItem => !string.IsNullOrEmpty(innerListItem).ToList())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接