从匹配两个单独列表<t> s </t> </t>获取列表<t>

时间:2012-03-30 15:27:44

标签: c# list optimization

全部,我想知道是否有更好的方法可以从两个单独的List<T>获取List<T>个匹配值。

如果我想找到另一个列表itemList<string>中的字符串列表bankList<string>(一个不同的列表)中的所有项目,我目前的方式会这样做(也是不同的,所以返回的列表也是

是不同的 - 没有重复
List<string> matchingList = new List<string>();
foreach (string s in itemList)
    if (bankList.Contains(s))
        matchingList.Add(s);

有没有更好和/或更快的方法呢?

扩展:我很感激这个问题得到了回答(这是有利的)但是出于兴趣,获得否定的最佳方法(即那些项目不在 {{1 }})

bankList<string>

或者在这种情况下它会回到

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

我认为在这种情况下有趣的可能是后者?

1 个答案:

答案 0 :(得分:16)

有一种更清晰的方法:

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

此外,它会更快,因为它不会是O(n^2)。现在,您正在浏览bankList中每个项目的itemList。相反,您应该从HashSet构建itemList,然后在行走HashSet时检查bankList中的遏制。这正是Enumerable.Intersect将要做的事情。

所以,你在两个方面都获胜:性能和可读性。

  

是获得否定的最佳方式(即不在bankList中的那些项目)

说完

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