2012-03-30 46 views
2

全部,我想知道是否有更好的方法從兩個獨立的List<T> s獲取匹配值的List<T>從匹配兩個分開的列表中獲取一個列表<T><T> s

如果我想找到字符串列表itemList<string>(一個獨特的列表),其是在另一個列表bankList<string>所有項目我會做到這一點目前的方式(也不同,因此返回的列表也不同 - 沒有重複)會

List<string> matchingList = new List<string>(); 
foreach (string s in itemList) 
    if (bankList.Contains(s)) 
     matchingList.Add(s); 

有沒有更好和/或更快的方法來做到這一點?

擴展:我很欣賞的問題已回答(這是趁着),但出於利益考慮,會得到否定的最佳方式(即,這些項目bankList<string>)是

List<string> interList = new List<string>(); 
interList = itemList.Intersect(bankList).ToList<string>(); 
matchingList = itemList.Except(interList).ToList<string>(); 

或在這種情況下會是回到

List<string> matchingList = new List<string>(); 
foreach (string s in itemList) 
    if (!bankList.Contains(s)) 
     matchingList.Add(s); 

我認爲,在這種情況下,有趣的可能是後者?

+0

見我的編輯爲您的第二個問題。一般來說,你應該提出一個新問題,而不是編輯一個新的問題。一旦你接受了你的問題的答案,大多數人都不會注意。 – jason 2012-03-30 16:07:20

回答

16

有做這個更清晰方式:

var matchingList = itemList.Intersect(bankList).ToList(); 

此外,它會更快,因爲它不會O(n^2)。現在,您將遍歷itemList中的每個項目的bankList。相反,您應該從itemList建立一個HashSet,然後在步行bankList時檢查該HashSet中的遏制情況。這正是Enumerable.Intersect所能做的。

所以,你在兩個方面都取得了勝利:性能和可讀性。

會得到否定的最佳方式(即,這些項目不是在bankList)是

只是說

var except = itemList.Except(bankList).ToList(); 
+2

其實這也會更快,因爲'Intersect'在內部使用Hashset - 另一方面OP的方法是O(n^2) – BrokenGlass 2012-03-30 15:30:11

+0

是的,我只是在編輯它。 – jason 2012-03-30 15:30:56

+0

+1 Nice!之前沒有看到過,我現在正在用C#進入舞臺,現在我逐漸學習了很多'隱藏'(大多數情況下更好)的方法來做事情。謝謝你的時間。 – MoonKnight 2012-03-30 15:31:54