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

时间:2018-10-22 19:07:53

标签: c# list linq

我正在寻找一种从字符串列表中删除空字符串值的更有效方法。

下面的代码可以工作,但是对于非常大的数据集,这似乎效率很低。有更有效的方法吗?

仅供参考-刚开始只是建立一个数据集,使其具有包含空字符串的列表的列表

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"         
    */      
}

4 个答案:

答案 0 :(得分:6)

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

  

删除所有与指定谓词定义的条件相匹配的元素。

{"name": "field12", "type": "string"}

这就是您所需要的。其他答案有foreach (var l in list) { l.RemoveAll(x => string.IsNullOrEmpty(x)); } 和两次Select().Where(),对于像这样的简单操作来说,这是过多的开销。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

由于您希望返回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();
}

答案 3 :(得分:0)

主要思想:遍历列表并从列表中删除空字符串。

list.Select(outerListItem => outerListItem.Where(innerListItem => !string.IsNullOrEmpty(innerListItem).ToList())