在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]); } }