2014-03-06 67 views
1

我正在閱讀大文本文件中的行。這些文件中有偶爾的字符串,這些字符串位於預設的可能性列表中,我希望檢查當前正在讀取的行是否與可能性列表中的任何字符串匹配。如果有匹配,我想簡單地將它們追加到不同的列表中,並繼續我用來讀取文件的循環。有沒有更好的方法調用C#中的對象列表的比較?

我只是想知道是否有一個更有效的方法來做一個line.Contains()或equivilance檢查對比說列表中的第一個元素,然後第二個等,而不使用嵌套循環或長如果充滿「或」的陳述。什麼我現在有

例子:

List<string> possible = new List<string> {"Cat", "Dog"} 
using(StreamReader sr = new StreamReader(someFile)) 
{ 
    string aLine; 
    while ((aLine = sr.Readline()) != null) 
    { 
    if (...) 
    { 
     foreach (string element in possible) 
     { 
     if line.Contains(element) == true 
     { 
      ~add to some other list 
      continue 
     } 
     } 
     ~other stuff 
    } 
    } 
+0

因此,如果行包含這些值中的任何一個,您想要將該行添加到列表中? –

+1

對'可能的'使用'HashSet'會對更大的集合產生更好的性能。 – Magnus

+0

@ Selmann22是的。 – JSA

回答

1

我猜你正在尋找:

if(possible.Any(r=> line.Contains(r))) 
{ 

} 
+0

那麼?這是否有效?在if語句的內部,你仍然需要找到共同的元素,並且需要另一個查詢或循環 –

+1

@ Selman22,它會被等同於現在的僞代碼OP,LINQ只是優雅的:P – Habib

+2

@ Selman22:效率被定義爲生產的價值除以消耗的資源。由於我們不知道你的價值或你關心的資源,所以除了你以外,沒有人能衡量效率。 –

3

我不知道更高效的運行時明智的,但你可以消除大量的代碼使用LINQ:

otherList.AddRange(File.ReadAllLines(somefile). 
    .Where(line => possible.Any(p => line.Contains(p))); 
+0

仍然試圖去弄LINQ,但只是在這裏看起來這可能是一個問題,我的意思是,因爲我需要按照特定的順序將文件分成五個列表,這只是我需要的一種情況注意。 LINQ能否爲更廣泛的病例提供更多的效用,然後用類似的方法處理一個病例? – JSA

+3

您可以在這裏使用'ReadLines'而不是'ReadAllLines'來允許來自文件的數據流式傳輸。 – Servy

0

可以分開你的工作獲取數據然後分析數據。你不必在同一個循環中完成。

在讀取行之後,有很多方法可以對它們進行過濾。最可讀和可維護的IMO是使用Linq。

您可以更改您的代碼如下:

// get lines 
var lines = File.ReadLines("someFile"); 

// what I am looking for 
var clues = new List<string> { "Cat", "Dog" }; 

// filter 1. Are there clues? This is if you only want to know 
var haveCluesInLines = lines.Any(l => clues.Any(c => l.Contains(c))); 

// filter 2. Get lines with clues 
var linesWithClues = lines.Where(l => clues.Any(c => l.Contains(c))); 

編輯:

最有可能你就沒有什麼線索和多條線路。這個例子用每一條線索檢查每一行,節省時間。

相關問題