获取列表<;T>;从匹配两个分离列表<;T>;s
本文关键字:gt lt 列表 两个 分离 获取 | 更新日期: 2023-09-27 18:29:43
所有,我想知道是否有更好的方法从两个单独的List<T>
s中获得匹配值的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)
。现在,您正在为itemList
中的每个项目遍历bankList
。相反,您应该从itemList
构建一个HashSet
,然后在遍历bankList
时检查该HashSet
中的包含性。这正是Enumerable.Intersect
要做的。
因此,您在性能和可读性这两个方面都取得了胜利。
得到否定(即那些不在银行清单中的项目)的最好方法是吗
只需说
var except = itemList.Except(bankList).ToList();