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
<代码>其中将基于谓词进行筛选。您应该能够执行以下操作:
演示:
- 您不需要
,因为S[0]已经是一个字符串ToString()
- 您可能需要处理空的大小写,或者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
<代码>其中将基于谓词进行筛选。您应该能够执行以下操作:
演示:
- 您不需要
,因为S[0]已经是一个字符串ToString()
- 您可能需要处理空的大小写,或者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现在按预期工作。