Digamos que hay¿Cómo comparar dos listas <String> entre sí?
List<string> a1 = new List<string>();
List<string> a2 = new List<string>();
¿Hay manera de hacerlo de esta manera?
if (a1 == a2)
{
}
Digamos que hay¿Cómo comparar dos listas <String> entre sí?
List<string> a1 = new List<string>();
List<string> a2 = new List<string>();
¿Hay manera de hacerlo de esta manera?
if (a1 == a2)
{
}
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
¡Sí! ¡Guay! tyy !!!! –
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
@MarkByers, cuando pruebo el SequenceEqual() en mi sistema, por qué arroja una excepción como List
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()){}
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. –
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);
Malo de su parte @DownVoters. No hay razón para downvote. Tomando venganza ??? –
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
Además, Intersect arrojará duplicados, por lo que solo verificará los distintos elementos en 'a1' y' a2'. – RichK
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:
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):
probada usando Visual Studio 2010, C# .NET 4 Client Profile en un Core i7-920
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
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());
}
¿Qué espera exactamente que haga? devuelve true si ambas listas tienen los mismos valores y en el mismo orden? –