全部,我想知道是否有更好的方法可以从两个单独的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>();
我认为在这种情况下有趣的可能是后者?
答案 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();