Est-il un AddUnique méthode similaire à Addrange() pour accédez à la liste en C#
J'ai une liste en C#:
var list = new List<Car>();
list.AddRange(GetGreenCars());
list.AddRange(GetBigCars());
list.AddRange(GetSmallCars());
le problème est que certains de le même les voitures sont retournées dans les différentes fonctions et je ne veux pas dans la liste plus d'une fois. Chaque voiture a un Nom unique attribut. Est-il de toute façon je peux avoir quelque chose de ce genre ci-dessus, mais uniquement pour ajouter des éléments, s'ils sont uniques ?
Vous devez vous connecter pour publier un commentaire.
Un
List<T>
ne semble pas être la collecte approprié ici. Vous voulez probablement unISet<T>
la mise en œuvre commeHashSet<T>
(ouSortedSet<T>
si vous avez besoin de la commande).Pour cela, vous aurez besoin de rédiger un
IEqualityComparer<T>
de mise en œuvre qui définit l'égalité entre les voitures en fonction de laName
de la propriété. Si c'est le 'canonique' définition de la voiture de l'égalité, vous pouvez aussi envisager directement la construction de cette définition dans leCar
type lui-même (object.Equals
,object.GetHashCode
et, idéalement, de mettre en œuvreIEquatable<T>
trop).Un seul choix est de les ajouter et de supprimer la répétition de celles:
Une autre option est de faire quelque chose comme:
Compte tenu de remplacer le
.Equals()
méthode pourCar
pour déterminer un objet voiture est la même qu'une autre voiture de l'objet, puis le suivant devrait fonctionner w/o la rédaction d'une méthode d'extension.GetGreenCars().Except(list)
Encore une autre option à l'aide de Linq:
J'ai créé une méthode d'extension qui ajoute uniquement les valeurs uniques à tout mettre en œuvre
ICollection<T>
(y compris unList<T>
) à partir d'unIEnumerable<T>
. À la différence des implémentations qui utilisentList<T>.Contains()
, cette méthode vous permet de spécifier une expression lambda qui détermine si deux éléments sont les mêmes.Utilisation:
Une option différente dans le cas où le programmeur ne peut pas, ou ne voulez pas utiliser Linq.
Si la liste est vide, comme dans l'exemple ci-dessus, vous pouvez effectivement éviter d'utiliser FindAll(...) le premier AddRange().
En supposant que votre Get*Voitures() renvoient des Listes de Voiture, une autre option pourrait être:
et si vous voulez comparer une propriété (id dans ce cas), cela devrait fonctionner