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)
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)
我写了这个扩展来解决这个问题:
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)
| 归档时间: |
|
| 查看次数: |
2899 次 |
| 最近记录: |