从匹配两个单独的List<T>获取一个List<T>

3
大家好,我想知道是否有更好的方法来从两个不同的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);

有没有更好或更快的方法来做这件事?

扩展:我很感激问题已经被回答了(并且这是在利用),但出于兴趣,获取否定(即那些不在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);

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

针对你的第二个问题,参见我的编辑。一般来说,你应该提出一个新的问题而不是编辑原有的问题。一旦你已经接受了问题的答案,大多数人就不会再关注它了。 - jason
1个回答

16

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

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

此外,它将更快,因为它不会是O(n^2)。现在,您正在遍历bankList中的每个项目itemList。相反,您应该从itemList构建一个HashSet,然后在遍历bankList时检查是否包含在该HashSet中。这正是Enumerable.Intersect将要做的。

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

获取否定(即那些不在bankList中的项目)的最佳方法是什么?

只需说

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

2
实际上这也会更快,因为Intersect在内部使用一个Hashset - OP的方法则是O(n^2) - BrokenGlass
+1 很好!我以前没见过这个,现在我正在逐渐学习许多“隐藏”的(大多数情况下更好的)做事方式,已经到了使用C#的阶段。感谢您的时间。 - MoonKnight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接