2012-10-09 14 views
11

mam dwie listy posortowane jak poniżej:dostać elementów wspólnych list w C#

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

chcę wyjście będzie: {1, 1, 2}

Jak to zrobić w C#? Czy istnieje sposób korzystania z Linq?

+0

Co o 3 w swoim przykładzie? –

+0

To był błąd. Proszę zapoznać się z zaktualizowaną wersją. –

Odpowiedz

5

Dodatkowy 1 oznacza, że ​​nie można używać Intersect ponieważ zwraca zestaw.

Oto niektóre kod, który robi to, co trzeba:

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

To zadziałało. Dzięki Austin !! –

42

Zastosowanie Intersect:

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

Jak byś to odwrócił? tj. dostaję niezwykłe elementy. –

+0

@AshBurlaczenko - Co masz na myśli przez niezbyt często? Masz na myśli ['Except'] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx)? –

+1

@Manoj: list1.Except (list2) .ToList(); – Thousand

0

Jestem późno w odpowiedzi na to pytanie, to może pomóc w przyszłych odwiedzających.

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

To nie odpowiada na pytanie. To tylko fuks, że pozycje pasują. PO występuje po wystąpieniach, a nie po pozycjach. – Enigmativity

1

Działa to dobrze:

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)); 
Powiązane problemy