【问题标题】:Intersect two List<int> having repeated values相交两个具有重复值的 List<int>
【发布时间】:2014-05-28 04:50:02
【问题描述】:

我有两个 int 类型的列表:

List<int> list1 = new List<int> {12,55,55,55,34};
List<int> list2 = new List<int> {12,55};

如果我将 list1 与 list2 相交,那么预期的结果是 {12,55,55,55}

我怎样才能做到这一点?有没有其他方法可以达到同样的效果?

【问题讨论】:

  • @GrantWinney 通常在 .NET 中,交集只包含/排除第一个集合中的元素,它不连接集合。
  • @GrantWinney 第一个列表包含我动态创建控件的字段 ID。字段 ID 55 表示我需要在取自第二个列表的唯一公共控件(字段 id 12)之间重复创建的空格(空白文本块)。由于第二个列表代表常见的字段 ID。

标签: c#


【解决方案1】:

试试这个:

List<int> result = list1.Where(i => list2.Contains(i)).ToList();

这样做是只选择list1 中存在于list2 中的记录,这将导致IEnumerable&lt;int&gt;。然后,ToList() 将其转回为List&lt;int&gt;

这种性能方面的最佳版本是在调用Contains 之前将list2 转换为HashSet&lt;int&gt;。这样可以加快查找速度:

HashSet<int> hashSet = new HashSet<int>(list2);
List<int> result = list1.Where(i => hashSet.Contains(i)).ToList();

【讨论】:

  • 或者你可以使用方法组var result = list1.Where(list2.Contains).ToList();
  • 请注意,如果列表非常大,最好将 list2 转换为 HashSet,然后在 Contains 调用中使用 HashSet 而不是 list2。 HashSet 上的 Contains 是 O(1),而不是 List 上的 O(N)。
  • @Baldrick 完全正确,但我没有选择过早的优化,因为我们正在讨论交叉点的核心概念。优化后的结果是O(n*m),其中nlist1 的长度,mlist2 的长度
  • @DavidHaney:这就是为什么我 +1 了你的答案,并将其添加为评论。觉得值得一提,以备日后参考!
  • @DavidHaney:很好!一种比“最快的手指优先”更好的方法来建立一个体面的答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2016-05-14
  • 2015-02-05
  • 2023-04-02
  • 2023-02-26
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多