在C#中获取列表中的公共元素
我有两个排序列表如下:
var list1 = new List() { 1, 1, 1, 2, 3 }; var list2 = new List() { 1, 1, 2, 2, 4 };
我希望输出为: {1, 1, 2}
如何在C#中做到这一点? 有没有办法使用Linq?
额外1表示您不能使用Intersect
因为它返回一个集合。
这里有一些代码可以满足您的需求:
var list1 = new List() { 1, 1, 1, 2, 3 }; var list2 = new List () { 1, 1, 2, 2, 4 }; var grouped1 = from n in list1 group n by n into g select new {g.Key, Count = g.Count()}; var grouped2 = from n in list2 group n by n into g select new {g.Key, Count = g.Count()}; var joined = from b in grouped2 join a in grouped1 on b.Key equals a.Key select new {b.Key, Count = Math.Min(b.Count, a.Count)}; var result = joined.SelectMany(a => Enumerable.Repeat(a.Key, a.Count)); CollectionAssert.AreEquivalent(new[] {1, 1, 2}, result);
使用Intersect
:
var commonElements = list1.Intersect(list2).ToList();
这很好用:
var list1 = new List() { 1, 1, 1, 2, 3 }; var list2 = new List () { 1, 1, 2, 2, 4 }; var lookup1 = list1.ToLookup(x => x); var lookup2 = list2.ToLookup(x => x); var results = lookup1.SelectMany(l1s => lookup2[l1s.Key].Zip(l1s, (l2, l1) => l1));
我回答这个问题的时间已经很晚了,这可能有助于未来的访客。
List p = new List { 1, 1, 1, 2, 3 }; List q = new List { 1, 1, 2, 2, 4 }; List x = new List (); for (int i = 0; i < p.Count; i++ ) { if (p[i] == q[i]) { x.Add(p[i]); } }