2009-10-27 43 views
14

Esto debería ser fácil.LINQ: compruebe si dos listas son iguales

Quiero comprobar si dos listas son iguales ya que contienen todos los mismos elementos o no, las órdenes no son importantes.

elementos duplicados se consideran iguales, IEE, new[]{1,2,2} es lo mismo con new[]{2,1}

+0

@ 280Z28: ¿has votado una pregunta por las respuestas? No suena muy razonable. – Graviton

+0

@Ngu, gracias por la aclaración. –

+1

El SetEquals de HashSet es el más adecuado para comprobar si dos conjuntos son iguales a los definidos en esta pregunta – Lijo

Respuesta

28
var same = list1.Except(list2).Count() == 0 && 
      list2.Except(list1).Count() == 0; 
+2

bien, olvidé el segundo bit, no hay necesidad de menospreciar ... – leppie

+1

¿Qué es un duplicado diferente? – leppie

+11

Una versión aún más "linq-ish": '! List1.Except (list2) .Any() &&! List2.Except (list1).Any() ' – TLS

1

Que necesita para obtener la intersección de las dos listas: la pregunta

bool areIntersected = t1.Intersect(t2).Count() > 0; 

En respuesta a que estés modificación:

bool areSameIntersection = t1.Except(t2).Count() == 0 && t2.Except(t1).Count() == 0; 
+0

Creo que mi pregunta no está redactada claramente ... He modificado la pregunta – Graviton

+0

Si 't1' es {1, 2, 2 } y 't2' es {1, 2, 2}, esto incorrectamente devolverá falso. –

0

Si el recuento de elementos list1 en list2 es igual al recuento de elementos list2 en list1, entonces las listas contienen el mismo n una cantidad de elementos, ambos son subconjuntos el uno del otro; en otras palabras, ambos contienen los mismos elementos.

if (list1.Count(l => list2.Contains(l)) == list2.Count(l => list1.Contains(l))) 
    return true; 
else 
    return false; 
6

Editar: Esto fue escrito antes de la OP añadió que {1, 2, 2} es igual a {1, 1, 2} (con respecto a la manipulación de las entradas duplicadas).

Esto funcionará siempre que los elementos sean comparables por orden.

bool equal = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x)); 
+1

Esto no ayudará con duplicados. – leppie

+0

@leppie: ¿Qué quieres decir? Si 'list1' contiene 4' 3', entonces 'igual' solo sería verdadero si' list2' también contiene exactamente 4 '3'. Los duplicados funcionan bien. –

+0

Puede retirar las llamadas OrderBy si el orden de la secuencia será el mismo; como cuando compara listas de ocurrencias de pruebas. – Jason

3

El SetEquals de HashSet es el más adecuado para comprobar si dos conjuntos son iguales como se define en esta pregunta

 string stringA = "1,2,2"; 
     string stringB = "2,1"; 

     HashSet<string> setA = new HashSet<string>((stringA.Trim()).Split(',').Select(t => t.Trim())); 
     HashSet<string> setB = new HashSet<string>((stringB.Trim()).Split(',').Select(t => t.Trim())); 

     bool isSetsEqual = setA.SetEquals(setB); 

REFERENCIA:

  1. Check whether two comma separated strings are equal (for Content set)
+2

Usar HashSets parece ser la manera más elegante de hacer esto (y probablemente también bastante rápido). – ThisGuy

Cuestiones relacionadas