get common elements in lists in C#

Use Intersect:

 var commonElements = list1.Intersect(list2).ToList();

The extra 1 means you can't use Intersect because it returns a set.

Here's some code that does what you need:

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);

This works nicely:

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

Tags:

C#

Linq