Aquí están los puntos de referencia de los métodos de extensión LINQ. Los resultados se obtuvieron durante el desarrollo de un programa real.
Las pruebas: 2 listas (lst1 y lst2) cada uno aproximadamente 250000 objetos. Cada objeto (clave de clase) contiene una cadena y un número entero. La segunda lista contiene principalmente las mismas entradas que la primera, pero se agregan algunas entradas nuevas y algunas se eliminan.
He probado el método de extensión Except.
var except = lst2.Except (lst1);
Lista lst = except.ToList();
Estas 2 líneas produjeron 600 elementos de la lista de "nuevas incorporaciones". Lo sincronicé usando el objeto StopWatch. La velocidad es sorprendente: 220 ms. La computadora que utilicé no es de ninguna manera un "Gonzales rápido". Core 2 Duo T7700 - 2.4GHz.
Nota:
Aquí está la clave de clase, que implementa IEquatable i-cara.
public class Key : IEquatable<Key>
{
public int Index { get; private set; }
public string Name { get; private set; }
public Key(string keyName, int sdIndex)
{
this.Name = keyName;
this.Index = sdIndex;
}
// IEquatable implementation
public bool Equals(Key other)
{
//Check whether the compared object is null.
if (Object.ReferenceEquals(other, null)) return false;
//Check whether the compared object references the same data.
if (Object.ReferenceEquals(this, other)) return true;
//Check whether the products' properties are equal.
return Index.Equals(other.Index) && Name.Equals(other.Name);
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public override int GetHashCode()
{
//Get hash code for the name field if it is not null.
int hashKeyName = Name == null ? 0 : Name.GetHashCode();
//Get hash code for the index field.
int hashKeyIndex = Index.GetHashCode();
//Calculate the hash code for the Key.
return hashKeyName^hashKeyIndex;
}
}
¿Sabes qué tipo de garantía de rendimiento es esta?Presumiblemente Except tendría que hacer primero una copia ordenada de cada matriz. No puedo encontrar nada de esto en MSDN. – Eclipse
No, no hace una copia ordenada. Crea un conjunto a partir de la secuencia excluida, y luego itera sobre la secuencia fuente, produciendo cualquier elemento que no esté en la secuencia excluida. –
(Cuando digo "set" me refiero a "hash set".) –