在C#中获取列表中的公共元素

Man*_*dey 13 c# linq

我有两个排序列表如下:

var list1 = new List<int>() { 1, 1, 1, 2, 3 };
var list2 = new List<int>() { 1, 1, 2, 2, 4 };
Run Code Online (Sandbox Code Playgroud)

我希望输出为: {1, 1, 2}

如何在C#中做到这一点?有没有办法使用Linq?

Mah*_*mal 43

用途Intersect:

 var commonElements = list1.Intersect(list2).ToList();
Run Code Online (Sandbox Code Playgroud)

  • @MahmoudGamal:相交时输出为{1,2},但我想要{1,1,2}. (2认同)

Aus*_*nen 5

额外1表示您无法使用,Intersect因为它返回一组.

这里有一些代码可以满足您的需求:

var list1 = new List<int>() { 1, 1, 1, 2, 3 };
var list2 = new List<int>() { 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);
Run Code Online (Sandbox Code Playgroud)