【问题标题】:Getting a List<T> from Matching two Seperate List<T>s从匹配两个单独的 List<T> 中获取 List<T>
【发布时间】:2012-06-20 00:42:35
【问题描述】:

所有,我想知道是否有更好的方法从两个单独的List&lt;T&gt;s 中获取匹配值的List&lt;T&gt;

如果我想在字符串列表itemList&lt;string&gt;(一个不同的列表)中找到另一个列表bankList&lt;string&gt;中的所有项目(也不同,所以返回的列表也是不同的 - 没有重复),我目前会这样做的方式) 将是

List<string> matchingList = new List<string>();
foreach (string s in itemList)
    if (bankList.Contains(s))
        matchingList.Add(s);

有没有更好和/或更快的方法?

扩展:我很欣赏这个问题已经得到了回答(这是利用),但出于兴趣,最好的方法是获得否定(即那些不在中的项目bankList&lt;string&gt; ) 是

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);

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

【问题讨论】:

  • 查看我对第二个问题的编辑。一般来说,您应该提出一个新问题,而不是在其中编辑一个新问题。一旦您接受了问题的答案,大多数人就不会注意了。

标签: c# list optimization


【解决方案1】:

有一种更清晰的方法可以做到这一点:

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

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

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

获得否定(即那些不在bankList中的项目)的最佳方法是

随便说

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

【讨论】:

  • 实际上这也会更快,因为Intersect 在内部使用哈希集 - 另一方面,OP 的方法是 O(n^2)
  • +1 不错!以前没有见过这种情况,我现在正在使用 C# 进入舞台,因为我正在逐渐学习很多“隐藏”(大部分时间更好)的做事方式。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多