2011-07-08 52 views
0

我正在嘗試使用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 

我如何處理包含中的忽略列表?與我的上述代碼我沒有得到所需的輸出肯定

可以任何一個幫助嗎?

問候, KARTHIK

+3

你提到了LINQ SQL,但是這似乎是LINQ-to-Objects ......這裏有沒有SQL?還是僅僅是一個錯字? (提示:它從根本上影響了答案) –

+0

對不起。我的錯。我試圖在一些條件下使用LINQ讀取文件內容 – KK99

+0

ALso:'line.Split('\ n')' - 一行很少包含'\ n',否則它不是一行 - 如果這是涉及斜槓? –

回答

1

修了我的回答。錯誤在於你在忽略列表上做了ToString,這當然不起作用。您必須檢查列表中的每個項目,可以使用這樣的事情要做:

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

令人好奇:因爲上面的拉姆達只是路過一個值的方法,只有把值作爲參數,你可以這樣寫更加緊湊的方法組這樣的:

where !sIgnoreList.Any(line.Contains) 
+0

對不起,這是一個錯字。但我沒有得到我想要的結果,這個apporoack – KK99

+0

@Karthik,看到我修改後的答案。 –

+0

謝謝彼得。工作很好。這是我需要的 – KK99

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表示返回。

+0

試過並沒有工作 – KK99

+0

也許是因爲你正在尋找'foo.c'而不是'\ voodoo \ foo.c'? –

+0

是的,我想刪除所有包含foo.c的行。好吧,如果我給完整的路徑它的作品。但由於我的要求,我無法提供完整路徑 – KK99

0

將其更改爲:

where !sIgnoreList.Contains(line) 

你需要比較各單行並檢查它不會忽略列表存在。

這就是爲什麼弗拉季斯拉夫的答案沒有奏效。

+0

只有當我提供完整的路徑,這是不可能在我的情況下,因爲我有超過2000行在我的LST文件 – KK99

0

這裏的工作解決方案:

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

的問題是,你不想來檢查整個拍h並且混亂了一些詞/線部分。