当前位置: 动力学知识库 > 问答 > 编程问答 >

linq - get common elements in lists in C#

问题描述:

I have two sorted lists as below:

var list1 = new List<int>() { 1, 1, 1, 2, 3 };

var list2 = new List<int>() { 1, 1, 2, 2, 4 };

I want the output to be: {1, 1, 2}

How to do this in C#?

Is there a way using Linq?

网友答案:

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);
网友答案:

Use Intersect:

 var commonElements = list1.Intersect(list2).ToList();
网友答案:

I am late in answering this question, this might help future visitors.

            List<int> p = new List<int> { 1, 1, 1, 2, 3 };
            List<int> q = new List<int> { 1, 1, 2, 2, 4 };
            List<int> x = new List<int>();
            for (int i = 0; i < p.Count; i++ )
            {
                if (p[i] == q[i])
                {
                    x.Add(p[i]);
                }
            }
网友答案:

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));
分享给朋友:
您可能感兴趣的文章:
随机阅读: