Tengo una lista. Por razones válidas, duplico la Lista muchas veces y la uso para diferentes propósitos. En algún momento, necesito verificar si el contenido de todas estas colecciones es el mismo.cómo verificar el contenido de las colecciones (> 2) son las mismas
Bueno, sé cómo hacer esto. Pero como soy fanático de la codificación de "mano corta" (linq ...) me gustaría saber si puedo verificar esto de manera EFICAZ con la menor cantidad de líneas de código.
List<string> original, duplicate1, duplicate2, duplicate3, duplicate4
= new List<string();
//...some code.....
bool isequal = duplicate4.sequenceequal(duplicate3)
&& duplicate3.sequenceequal(duplicate2)
&& duplicate2.sequenceequal(duplicate1)
&& duplicate1.sequenceequal(original);//can we do it better than this
ACTUALIZACIÓN
Codeinchaos señaló ciertas senarios que no he pensado (duplicados y el orden de la lista) .Aunque SequenceEqual se hará cargo de los duplicados del orden de la lista puede ser un problema. Así que estoy cambiando el código de la siguiente manera. Necesito copiar las Listas para esto.
List<List<string>> copy = new List<List<int>> { duplicate1, duplicate2,
duplicate3, duplicate4 };
bool iseqaul = (original.All(x => (copy.All(y => y.Remove(x))))
&& copy.All(n => n.Count == 0));
Update2
Gracias a Eric-utilizando un HashSet puede ser muy eficiente de la siguiente manera. Esto no cubrirá duplicados sin embargo.
List<HashSet<string>> copy2 =new List<HashSet<string>>{new HashSet<string>(duplicate1),
new HashSet<string>(duplicate2),
new HashSet<string> duplicate3),
new HashSet<string>(duplicate4)};
HashSet<string> origninalhashset = new HashSet<string>(original);
bool eq = copy2.All(x => origninalhashset.SetEquals(x));
Update3 Gracias a Eric - El código original de este post con SequenceEqual trabajará con la clasificación. Como Sequenceequal considerará el orden de las colecciones, las colecciones deben ordenarse antes de llamar a sequenceequal. Supongo que esto no es una gran probelma, ya que la clasificación es bastante rápida (nlogn).
UPDATE4 Según la sugerencia de Brian, puedo utilizar una búsqueda para esto.
var originallkup = original.ToLookup(i => i);
var lookuplist = new List<ILookup<int, int>>
{ duplicate4.ToLookup(i=> i),
duplicate3.ToLookup(i=> i),
duplicate2.ToLookup(i=> i),
duplicate1.ToLookup(i=> i)
};
bool isequal = (lookuplist.Sum(x => x.Count) == (originallkup.Count * 4)) &&
(originallkup.All(x => lookuplist.All(i => i[x.Key].Count() == x.Count())));
Gracias a todos por sus respuestas.
¿Es importante el pedido? ¿O solo el contenido? – weston
@ weston: solo el contenido es importante – Jimmy
"Eficiencia" o "número de líneas de código más corto" Elija uno – weston