Liste distincte d'objets basée sur une clé arbitraire dans LINQ
J'ai quelques objets:
class Foo {
public Guid id;
public string description;
}
var list = new List<Foo>();
list.Add(new Foo() { id = Guid.Empty, description = "empty" });
list.Add(new Foo() { id = Guid.Empty, description = "empty" });
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty" });
list.Add(new Foo() { id = Guid.NewGuid(), description = "notempty2" });
Je voudrais processus de cette liste de telle manière que la id
domaine est unique, et jetez le non-objets uniques (basée sur l'id).
Du mieux que je pouvais venir avec est:
list = list.GroupBy(i => i.id).Select(g=>g.First()).ToList();
Est-il une plus belle/mieux/le plus rapide pour obtenir le même résultat.
source d'informationauteur Sam Saffron
Vous devez vous connecter pour publier un commentaire.
Un très élégant et l'intention de révéler option est de définir une nouvelle méthode d'extension sur IEnumerable
De façon à avoir:
Et ...
Un analogue de la classe helper peut être construit pour comparer des objets. (Il faudra faire mieux la gestion des valeurs null)
À l'aide de la
Distinct()
méthode est d'environ 4x plus rapide que l'utilisation GroupBy() dans mes tests informels. Pour 1 million de Foo mon test a Distinct() à propos de 0.89 secondes pour faire une gamme unique de sortir d'un tableau où GroupBy() prend environ 3,4 secondes.Mon Distinct() appel ressemble,
et
FooComparer
ressemble,et mon
GroupBy()
version ressemble,Créer un
IEqualityComparer<Foo>
qui renvoie true si l'id des champs sont les mêmes, et le passer à l'Distinctes() de l'opérateur.Remplacer Equals(object obj) et GetHashCode() méthodes:
et puis il suffit d'appeler Distinct():