我正在尝试使用LINQ读取文件和进程。
我有一个排除列表,如果我遇到文件中的某些单词,我应该省略该行
我的代码是
string sCodeFile = @"C:\temp\allcode.lst";
List<string> sIgnoreList = new List<string>() { "foo.c", "foo1.c" };
var wordsPerLine = from line in File.ReadAllLines(sCodeFile)
let items = line.Split('\n')
where !line.Contains(sIgnoreList.ToString())
select line;
foreach (var item in wordsPerLine)
{
console.WriteLine(item);
}
我的LST文件如下所示
\voodoo\foo.c
\voodoo\voodoo.h
\voodoo\std.c
\voodoo\foo1.h
最后我只想要
\voodoo\voodoo.h
\voodoo\std.c
如何处理contains中的被忽略列表?用上面的代码我肯定没有得到所需的输出
任何人都可以帮忙吗?
的问候, KARTHIK
答案 0 :(得分:1)
试试这个。
string sCodeFile = @"C:\temp\allcode.lst";
List<string> sIgnoreList = new List<string>() { "foo.c", "foo1.c" };
var wordsPerLine = File.ReadAllLines(sCodeFile).Where(n =>
{
foreach (var ign in sIgnoreList)
{
if (n.IndexOf(ign) != -1)
return false;
}
return true;
});
它将当前元素(n
)传递给lambda函数,该函数根据sIgnoreList
的每个元素对其进行检查。返回false
表示忽略该元素,true
表示已返回该元素。
答案 1 :(得分:1)
修改我的回答。错误是你在忽略列表上做了ToString
,这肯定是行不通的。您必须检查列表中的每个项目,这可以使用以下内容完成:
where !sIgnoreList.Any(ignore => line.Contains(ignore))
好奇心:因为上面的lambda只是将一个值传递给一个只接受该值作为参数的方法,所以你可以将它写成一个更紧凑的方法组,如下所示:
where !sIgnoreList.Any(line.Contains)
答案 2 :(得分:0)
将其更改为:
where !sIgnoreList.Contains(line)
您需要比较 每一行 ,并检查它是否在忽略列表中不存在。
这就是为什么弗拉迪斯拉夫的答案不起作用。
答案 3 :(得分:0)
这是工作解决方案:
var result = from line in File.ReadAllLines(codeFile)
where !ignoreList.Any(line.Contains)
select line;
问题是你不想检查整个路径并弄乱了一些文字/线条。