如何在保持重复的同时进行整数列表交集?

Duc*_*jor 10 c# intersection duplicates

我正在研究最大公因数和最小公共多项任务,我必须列出常见因素.Intersection()不起作用,因为它会删除重复项.Contains()将无法工作,因为如果它在第二个列表中看到int,则返回第一个列表中的所有匹配的int.有没有办法做一个不明显的交叉路口?

编辑:抱歉没有提供示例,这就是我的意思:

如果我有套:

{1, 2, 2, 2, 3, 3, 4, 5}
{1, 1, 2, 2, 3, 3, 3, 4, 4}
Run Code Online (Sandbox Code Playgroud)

我想要输出

{1, 2, 2, 3, 3, 4}
Run Code Online (Sandbox Code Playgroud)

Amy*_*y B 8

ILookup<int, int> lookup1 = list1.ToLookup(i => i);
ILookup<int, int> lookup2 = list2.ToLookup(i => i);

int[] result =
(
  from group1 in lookup1
  let group2 = lookup2[group1.Key]
  where group2.Any()
  let smallerGroup = group1.Count() < group2.Count() ? group1 : group2
  from i in smallerGroup
  select i
).ToArray();
Run Code Online (Sandbox Code Playgroud)

where表达式在技术上是可选的,我觉得它使意图更清晰.


如果你想要更简洁的代码:

ILookup<int, int> lookup2 = list2.ToLookup(i => i);

int[] result =
(
  from group1 in list1.GroupBy(i => i)
  let group2 = lookup2[group1.Key]
  from i in (group1.Count() < group2.Count() ? group1 : group2)
  select i
).ToArray();
Run Code Online (Sandbox Code Playgroud)


Her*_*ras 8

我写了这个扩展来解决这个问题:

public static IEnumerable<T> Supersect<T>(this IEnumerable<T> a, ICollection<T> b)
              => a.Where(b.Remove);
Run Code Online (Sandbox Code Playgroud)

例子:

var a = new List<int> { 1, 2, 2, 2, 3, 3, 4, 5 };
var b = new List<int> { 1, 1, 2, 2, 3, 3, 3, 4, 4};

var result = a.Supersect(b);
Run Code Online (Sandbox Code Playgroud)

结果:

{ 1, 2, 2, 3, 3, 4 }
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,但它确实通过清空 b 来改变 b (2认同)