开发者

How to check for list in LINQ

开发者 https://www.devze.com 2023-03-18 00:40 出处:网络
I am trying to read a file and process 开发者_JS百科using LINQ. I have a exclude list where if i encounter certain words in the file, i should omit that line

I am trying to read a file and process 开发者_JS百科using LINQ.

I have a exclude list where if i encounter certain words in the file, i should omit that line

my code is

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);
}

My LST file looks like below

\voodoo\foo.c
\voodoo\voodoo.h
\voodoo\std.c
\voodoo\foo1.h

in the end i want only

\voodoo\voodoo.h
\voodoo\std.c

How can i process the ignored list in contains? with my above code i dont get the desired output for sure

can any one help?

regards, Karthik


Revised my answer. The bug is that you're doing a ToString on the ignore list, which certainly will not work. You must check each item in the list, which can be done using something like this:

where !sIgnoreList.Any(ignore => line.Contains(ignore))

A curiosity: since the above lambda is just passing a value into a method that only take the value as a parameter, you can write this even more compact as a method group like this:

where !sIgnoreList.Any(line.Contains)


Try this.

        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;
        });

It passes the current element (n) to a lambda function, which checks it against every element of the sIgnoreList. Returning false means the element is ignored, true means it's returned.


Change it to:

where !sIgnoreList.Contains(line)

You need to compare each single line and check that it doesn't exist in the ignore list.

That's why the Vladislav's answer did not work.


Here's the working solution:

        var result = from line in File.ReadAllLines(codeFile)
                     where !ignoreList.Any(line.Contains)
                     select line;

The problem was you didn't want to check for the whole path and messed up words/lines part a bit.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号