获取列表<;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);

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

获取列表<;T>;从匹配两个分离列表<;T>;s

有一种更清晰的方法:

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

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

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

得到否定(即那些不在银行清单中的项目)的最好方法是吗

只需说

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