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