如何检查LINQ中的列表

时间:2011-07-08 08:44:18

标签: c# linq

我正在尝试使用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

4 个答案:

答案 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;

问题是你不想检查整个路径并弄乱了一些文字/线条。