如果满足特定条件,则使用Linq从List <string []>中删除行

时间:2017-11-09 11:36:59

标签: c# linq

我一直在寻找这个问题的解决方案,但找不到适用的情况,也无法理解它。

我有一个List<String[]>对象(已解析的CSV文件),如果行中的第一个值等于我的条件,则想删除所有行。

我尝试过以下(有变化)并且似乎无法删除这些行,它只是通过它们:

rows.RemoveAll(s => s[0].ToString() != "Test");

我目前正在阅读,如果s(行中的第一个值)不等于“测试”,请删除s[0]

有人能指出我正确的方向吗?

谢谢,Al。

编辑更广泛的背景/更好地理解:

代码如下:

  private void CleanUpCSV(string path)
    {

        List<string[]> rows = File.ReadAllLines(path).Select(x => x.Split(',')).ToList();
        rows.RemoveAll(s => s[0] != "Test");

        using (StreamWriter writer = new StreamWriter(path, false))
        {
            foreach (var row in rows)
            {
                writer.WriteLine(row);
            }
        }
    }

所以问题是 - &gt;为什么这不会删除不以“Test”开头的行,写完后,为什么它会将System.String []作为所有值返回?

4 个答案:

答案 0 :(得分:2)

你试过Where了吗? Where将根据谓词进行过滤。你应该可以这样做:

演示:Try it online!

    List<string[]> rows = new List<string[]> { new []{"Test"}, new []{ "Foo"} };
    rows = rows.Where(s => s[0] == "Test").ToList();

    foreach(var row in rows)
    {
        Console.WriteLine(string.Join(",", row));   
    }

输出

Test
  • 你不需要ToString(),因为S [0]已经是一个字符串
  • 你可能想要处理空案例或s [0]可以抛出
  • 您可以使用s.First()而不是s [0]
  • 您可以在msdn
  • 上详细了解Predicate

修改

对于你的例子:

private void CleanUpCSV(string path)
{

    var rows = File.ReadAllLines(path).Select(x => x.Split(','));

    using (StreamWriter writer = new StreamWriter(path, false))
    {
        foreach (var row in rows.Where(s => s[0] == "Test"))
        {
            writer.WriteLine(string.Join(",", row));
        }
    }
}

顺便说一下,您可能希望使用库来处理csv解析。我个人使用CsvHelper

答案 1 :(得分:1)

代码中唯一的错误如下:

由于行是string[]这个

writer.WriteLine(row);

不会给你你期待的结果。

像这样改变

writer.WriteLine(String.Join(",", row));

string[]转换回其原始形式。

任何其他&#34;优化&#34;在这里提出的所有答案都不是最佳的。

答案 2 :(得分:0)

如果您真的想要删除第一个元素不是&#34;测试&#34;的项目,那么您的代码应该可以工作,但您不需要调用.ToString ()在s [0],因为它已经是一个字符串。如果这对您不起作用,也许您的问题潜伏在其他地方?如果您在更广泛的背景下提供代码示例,您可以获得更多帮助

答案 3 :(得分:0)

这样过滤它:

var filteredList = rows.Where(s => s[0] == "test").ToArray();