2012-10-09 76 views
11

tengo dos listas ordenadas como abajo:obtener elementos comunes en las listas en C#

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

Quiero que la salida sea: {1, 1, 2}

Cómo hacer esto en C#? ¿Hay alguna manera de usar Linq?

+0

¿Qué hay de 3 en su ejemplo? –

+0

Eso fue un error. Por favor, consulte la versión actualizada. –

Respuesta

5

El extra de 1 significa que no puede utilizar Intersect porque devuelve un conjunto.

Aquí hay un código que hace lo que necesita:

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

Funcionó. ¡Gracias Austin! –

42

Uso Intersect:

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

¿Cómo invertirías esto? Es decir, obtener elementos poco comunes. –

+0

@AshBurlaczenko - ¿Qué quiere decir con poco común? ¿Quiere decir ['Except'] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx) ?? –

+1

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

0

tardo en responder a esta pregunta, esto podría ayudar a los futuros visitantes.

  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

Esto no responde la pregunta. Es solo un golpe de suerte que las posiciones coincidan. El OP es después de las ocurrencias, no de las posiciones. – Enigmativity

1

Esto funciona muy bien:

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