我一直在寻找这个问题的解决方案,但找不到适用的情况,也无法理解它。
我有一个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 []作为所有值返回?
答案 0 :(得分:2)
你试过Where
了吗? Where
将根据谓词进行过滤。你应该可以这样做:
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]已经是一个字符串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();