2012-03-30 39 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