从匹配两个单独列表<T>获取列表<T>

Moo*_*ght 3 c# optimization list

所有,我想知道是否有更好的方法List<T>从两个单独的List<T>s 获得匹配的值.

如果我想找到itemList<string>另一个列表中的字符串列表(一个不同的列表)中的所有项目bankList<string>(也是不同的,因此返回的列表也是不同的 - 没有重复),我将这样做的方式

List<string> matchingList = new List<string>();
foreach (string s in itemList)
    if (bankList.Contains(s))
        matchingList.Add(s);
Run Code Online (Sandbox Code Playgroud)

是否有更好和/或更快的方法?

扩展:我很欣赏这个问题已被回答(这是有利的),但出于兴趣,获得否定的最佳方式(即那些 在内的项目bankList<string>)是

List<string> interList = new List<string>();
interList = itemList.Intersect(bankList).ToList<string>();
matchingList = itemList.Except(interList).ToList<string>();
Run Code Online (Sandbox Code Playgroud)

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

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

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

jas*_*son 16

有一个更清晰的方法来做到这一点:

var matchingList = itemList.Intersect(bankList).ToList();
Run Code Online (Sandbox Code Playgroud)

而且,它会更快,因为它不会O(n^2).现在,你正在遍历bankList每个项目itemList.相反,您应该构建一个HashSetfrom itemList,然后在HashSet行走时检查包含内容bankList.这正是Enumerable.Intersect将要做的.

因此,您在两个方面都获胜:性能和可读性.

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

说啊

var except = itemList.Except(bankList).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 实际上这也会更快,因为`Intersect`在内部使用Hashset - 另一方面OP的方法是O(n ^ 2) (2认同)