C# 从列表中删除行<;字符串[]>;如果满足特定标准,则使用Linq

C# 从列表中删除行<;字符串[]>;如果满足特定标准,则使用Linq,c#,linq,C#,Linq,我已经到处寻找这个问题的解决方案,但找不到一个合适的环境,我也无法理解它 我有一个列表对象(一个已解析的CSV文件),如果行中的第一个值等于我的条件,我想删除任何行 我尝试了以下方法(有一些变化),但似乎无法让它删除这些行,它只是跳过了这些行: rows.RemoveAll(s => s[0].ToString() != "Test"); 如果s[0](行中的第一个值)不等于“Test”,则将其读取为删除s 有人能为我指出正确的方向吗 谢谢,艾尔 编辑以获得更广泛的背景/更好的理解: 代

我已经到处寻找这个问题的解决方案,但找不到一个合适的环境,我也无法理解它

我有一个
列表
对象(一个已解析的CSV文件),如果行中的第一个值等于我的条件,我想删除任何行

我尝试了以下方法(有一些变化),但似乎无法让它删除这些行,它只是跳过了这些行:

rows.RemoveAll(s => s[0].ToString() != "Test");
如果
s[0]
(行中的第一个值)不等于“Test”,则将其读取为删除
s

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

谢谢,艾尔

编辑以获得更广泛的背景/更好的理解:

代码如下:

  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);
            }
        }
    }
private void cleanupcv(字符串路径)
{
List rows=File.ReadAllLines(path)。选择(x=>x.Split(',')).ToList();
rows.RemoveAll(s=>s[0]!=“Test”);
使用(StreamWriter=newstreamwriter(路径,false))
{
foreach(行中的变量行)
{
writer.WriteLine(世界其他地区);
}
}
}

所以问题是->为什么不删除不以“Test”开头的行,并且在写入时,为什么它会将System.String[]作为所有值返回?

您是否尝试使用
Where
<代码>其中将基于谓词进行筛选。您应该能够执行以下操作:

演示:

  • 您不需要
    ToString()
    ,因为S[0]已经是一个字符串
  • 您可能需要处理空的大小写,或者s[0]可能会抛出
  • 可以使用s.First()代替s[0]
  • 您可以在上了解有关
    谓词的更多信息
编辑 例如:

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解析。我个人使用

您是否尝试过使用
Where
<代码>其中
将基于谓词进行筛选。您应该能够执行以下操作:

演示:

  • 您不需要
    ToString()
    ,因为S[0]已经是一个字符串
  • 您可能需要处理空的大小写,或者s[0]可能会抛出
  • 可以使用s.First()代替s[0]
  • 您可以在上了解有关
    谓词的更多信息
编辑 例如:

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解析。我个人使用

如果您确实要删除第一个元素不是“Test”的项,那么代码应该可以工作,尽管您不需要在s[0]上调用.ToString(),因为它已经是一个字符串。如果这对你不起作用,也许你的问题潜伏在别处?如果您在更广泛的上下文中给出代码示例,您可以获得更多帮助

如果您确实要删除第一个元素不是“Test”的项,那么您的代码应该可以工作,尽管您不需要在s[0]上调用.ToString(),因为它已经是一个字符串。如果这对你不起作用,也许你的问题潜伏在别处?如果您在更广泛的上下文中给出代码示例,您可以获得更多帮助

将其过滤为以下内容:

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

改为按如下方式过滤:

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

代码中唯一的错误如下所示:

因为行是
string[]

writer.WriteLine(row);
不会给你你期望的结果

像这样改变它

writer.WriteLine(String.Join(",", row));
字符串[]
转换回其原始形式


这里提出的所有答案中的任何其他“优化”也不是真正的最优。

代码中唯一的错误是:

因为行是
string[]

writer.WriteLine(row);
不会给你你期望的结果

像这样改变它

writer.WriteLine(String.Join(",", row));
字符串[]
转换回其原始形式


这里提出的所有答案中的任何其他“优化”也不是真正的最优。

“似乎无法使其起作用”-问题描述不清楚表达式是否应该起作用,除非您不需要
.ToString()
,除非您实际上没有字符串。此外,您还需要解释在尝试该代码时会发生什么。它会移除所有东西吗?没有什么?错误的值,如果是,哪些值?顺便说一下,这不是linq。请尝试:rows.Where(s=>s[0]!=“Test”).ToList();您的查询应该是“==”而不是“!=”。问题到底是什么?您是在问如何使用谓词从列表中删除行,还是在问为什么writer循环的输出最终只写入包含“System.String[]”的行?“似乎无法使其工作”-问题描述不清楚表达式应该工作,只是您不需要
.ToString()
,除非你实际上没有字符串。此外,您还需要解释在尝试该代码时会发生什么。它会移除所有东西吗?没有什么?错误的值,如果是,哪些值?顺便说一下,这不是linq。请尝试:rows.Where(s=>s[0]!=“Test”).ToList();您的查询应该是“==”而不是“!=”。问题到底是什么?您是在问如何使用谓词从列表中删除行,还是在问为什么writer循环的输出最终只写入包含“System.String[]”的行?谢谢您ALOISG和@CSharpie现在按预期工作。谢谢您ALOISG和@CSharpie现在按预期工作。