2012-10-09 24 views
11

ho due liste ordinate come qui sotto:ottenere elementi comuni nelle liste in C#

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

voglio l'output di essere: {1, 1, 2}

Come fare questo in C#? C'è un modo per usare Linq?

+0

cosa circa 3 nel tuo esempio? –

+0

Questo è stato un errore. Si prega di fare riferimento alla versione aggiornata. –

risposta

5

L'extra 1 significa che non è possibile utilizzare Intersect perché restituisce un set.

Ecco po 'di codice che fa quello che vi serve:

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

Ha funzionato. Grazie Austin !! –

42

Uso Intersect:

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

Come invertiresti questo? ottengo elementi non comuni –

+0

@AshBurlaczenko - Cosa intendi per non comune? Intendi ['Eccetto'] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx) ?? –

+1

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

0

sono in ritardo nel rispondere a questa domanda, questo potrebbe aiutare i futuri visitatori.

  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

Questo non risponde alla domanda. È solo un colpo di fortuna che le posizioni corrispondono. L'OP è dopo le occorrenze e non le posizioni. – Enigmativity

1

Questo funziona bene:

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