所有,我想知道是否有更好的方法可以从两个单独的 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);

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

最佳答案

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

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

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

因此,您在两个方面都取得了胜利:性能和可读性。



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

关于c# - 从匹配两个单独的 List<T> 中获取 List<T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9945988/

10-10 09:51