J'ai une liste
List<MyObject> myList
et j'ajoute des éléments à une liste et je veux vérifier si cet objet est déjà dans la liste.
donc avant de faire ça:
myList.Add(nextObject);
Je veux voir si nextObject est déjà dans la liste.
L'objet "MyObject" a un certain nombre de propriétés mais la comparaison est basée sur la correspondance sur deux propriétés.
Quelle est la meilleure façon de faire une vérification avant d'ajouter un nouveau "MyObject" à cette liste de "MyObject" s.
La seule solution que j'ai imaginée était de passer d'une liste à un dictionnaire, puis de faire de la clé une chaîne concaténée des propriétés (cela semble un peu peu élégant).
D'autres solutions plus propres utilisant la liste ou LINQ ou autre chose?
Utilisez simplement la méthode Contains . Notez que cela fonctionne basé sur la fonction d'égalité
Equals
la source
S'il est maintenable d'utiliser ces 2 propriétés, vous pouvez:
la source
Êtes-vous sûr d'avoir besoin d'une liste dans ce cas? Si vous remplissez la liste avec de nombreux éléments, les performances en souffriront avec
myList.Contains
oumyList.Any
; le temps d'exécution sera quadratique. Vous voudrez peut-être envisager d'utiliser une meilleure structure de données. Par exemple,Vous pouvez utiliser un HashSet de la manière suivante:
Bien sûr, si cette définition de l'égalité pour
MyClass
est «universelle», vous n'avez pas besoin d'écrire uneIEqualityComparer
implémentation; vous pouvez simplement remplacerGetHashCode
etEquals
dans la classe elle-même.la source
Un autre point à mentionner est que vous devez vous assurer que votre fonction d'égalité est conforme à vos attentes. Vous devez remplacer la méthode equals pour définir les propriétés de votre objet devant correspondre pour que deux instances soient considérées comme égales.
Ensuite, vous pouvez simplement faire mylist.contains (item)
la source
Voici une application de console rapide pour illustrer le concept de résolution de votre problème.
Prendre plaisir!
la source
Edit: j'avais d'abord dit:
Ce qui est inélégant dans la solution du dictionnaire. Cela me semble parfaitement élégant, d'autant plus qu'il suffit de paramétrer le comparateur lors de la création du dictionnaire.
Bien sûr, cependant, il est inélégant d'utiliser quelque chose comme clé alors que c'est aussi la valeur.
Par conséquent, j'utiliserais un HashSet. Si des opérations ultérieures nécessitaient une indexation, je créerais une liste à partir de celle-ci lorsque l'ajout était terminé, sinon, utilisez simplement le hashset.
la source
Simple mais ça marche
ou
la source
Si vous utilisez EF core, ajoutez
Exemple
la source