2012-03-07 15 views

Respuesta

87

Si desea comprobar que los elementos dentro de la lista son iguales y en el mismo orden, puede utilizar SequenceEqual:

if (a1.SequenceEqual(a2)) 

ver su funcionamiento en línea: ideone

+0

¡Sí! ¡Guay! tyy !!!! –

+0

No olvide que también podría implementar su propio 'IEqualityComparer' y proporcionarlo como segundo argumento (p. Ej., [Un comparador IgnoreCase para cadena] (http://msdn.microsoft.com/en-us/library/system.stringcomparer). currentcultureignorecase.aspx)). – Oliver

+0

@MarkByers, cuando pruebo el SequenceEqual() en mi sistema, por qué arroja una excepción como List no contiene una definición para 'SequenceEqual' y ningún método de extensión 'SequenceEqual' acepta un primer argumento de tipo .... .. –

6

Usted podría también use Except (produce la diferencia establecida de dos secuencias) para verificar si hay una diferencia o no:

IEnumerable<string> difference = a1.Except(a2); 
if(!difference.Any()){} 
+6

Dos posibles problemas con el uso de 'Except': solo devolverá elementos de' a1' que no existan en 'a2', por lo que si' a2' contiene elementos adicionales, esto arrojará un falso negativo. En segundo lugar, no explica la duplicación del mismo artículo, solo existencia. Sigue siendo una herramienta poderosa, solo necesita ser utilizada con cuidado. –

-3

Puede comprobar en todos los caminos a continuación una lista

List<string> FilteredList = new List<string>(); 
//Comparing the two lists and gettings common elements. 
FilteredList = a1.Intersect(a2, StringComparer.OrdinalIgnoreCase); 
+0

Malo de su parte @DownVoters. No hay razón para downvote. Tomando venganza ??? –

+1

No voté, pero su respuesta en realidad no responde a la pregunta del OP. Produce una intersección, por lo que deberá hacer un paso adicional para verificar si esa intersección coincide con 'a1' y' a2'. – RichK

+1

Además, Intersect arrojará duplicados, por lo que solo verificará los distintos elementos en 'a1' y' a2'. – RichK

7

descubrí que SequenceEqual no es la forma más eficiente para comparar dos listas de cadenas (inicialmente de http://www.dotnetperls.com/sequenceequal).

quería probar esto mismo lo que he creado dos métodos:

/// <summary> 
    /// Compares two string lists using LINQ's SequenceEqual. 
    /// </summary> 
    public bool CompareLists1(List<string> list1, List<string> list2) 
    { 
     return list1.SequenceEqual(list2); 
    } 

    /// <summary> 
    /// Compares two string lists using a loop. 
    /// </summary> 
    public bool CompareLists2(List<string> list1, List<string> list2) 
    { 
     if (list1.Count != list2.Count) 
      return false; 

     for (int i = 0; i < list1.Count; i++) 
     { 
      if (list1[i] != list2[i]) 
       return false; 
     } 

     return true; 
    } 

El segundo método es un poco de código que me encontré y me preguntaba si podría ser rediseñado para ser "fácil de leer". (Y también se preguntó si LINQ optimización sería más rápido.)

Como resultado, con dos listas que contienen 32k cuerdas, más de 100 ejecuciones:

  • Método 1 tuvo un promedio de 6761.8 garrapatas
  • Método 2 tomó un promedio de 3268.4 ticks

Normalmente prefiero LINQ para la brevedad, el rendimiento y la legibilidad del código; pero en este caso creo que se prefiere un método basado en bucle.

Editar:

I vuelve a compilar usando código optimizado, y corrió la prueba para 1000 iteraciones. Los resultados todavía favorecen el bucle (más aún):

  • Método 1 tuvo un promedio de 4227.2 garrapatas
  • Método 2 tuvo un promedio de 1831.9 garrapatas

probada usando Visual Studio 2010, C# .NET 4 Client Profile en un Core i7-920

+0

No es una comparación justa por dos razones: 1. No se usa igual, 2. Solo funciona para las listas, lo que está bien para esta pregunta. – mycroes

0
private static bool CompareDictionaries(IDictionary<string, IEnumerable<string>> dict1, IDictionary<string, IEnumerable<string>> dict2) 
    { 
     if (dict1.Count != dict2.Count) 
     { 
      return false; 
     } 

     var keyDiff = dict1.Keys.Except(dict2.Keys); 
     if (keyDiff.Any()) 
     { 
      return false; 
     } 

     return (from key in dict1.Keys 
       let value1 = dict1[key] 
       let value2 = dict2[key] 
       select value1.Except(value2)).All(diffInValues => !diffInValues.Any()); 
    } 
Cuestiones relacionadas