J'ai un cours Items
avec properties (Id, Name, Code, Price)
.
La liste Items
est remplie d'éléments en double.
Par exemple:
1 Item1 IT00001 $100
2 Item2 IT00002 $200
3 Item3 IT00003 $150
1 Item1 IT00001 $100
3 Item3 IT00003 $150
Comment supprimer les doublons de la liste en utilisant linq?
c#
linq
linq-to-objects
generic-list
Prasad
la source
la source
var set = new HashSet<int>(); var uniques = items.Where(x => set.Add(x.Id));
. Cela devrait être criminel de le faire ..Réponses:
Pour faire correspondre uniquement certaines propriétés, créez un comparateur d'égalité personnalisé, par exemple:
Ensuite, utilisez-le comme ceci:
la source
GroupBy
ne pouvait pas.XoR
opérateur^
en C #. Avait utilisé dans VB.NET viaXor
mais a dû faire une double prise à votre code pour voir ce qu'il était au début.1[DataAccess.HR.Dao.CCS_LOCATION_TBL] Distinct[CCS_LOCATION_TBL](System.Linq.IQueryable
1 [DataAccess.HR.Dao.CCS_LOCATION_TBL], System.Collections.Generic.IEqualityComparer`1 [ DataAccess.HR.Dao.CCS_LOCATION_TBL]) ', et cette méthode ne peut pas être traduite en une expression de magasin.la source
S'il y a quelque chose qui jette votre requête Distinct, vous voudrez peut-être regarder MoreLinq et utiliser l'opérateur DistinctBy et sélectionner des objets distincts par id.
la source
C'est ainsi que j'ai pu me regrouper avec Linq. J'espère que ça aide.
la source
FirstOrDefault
ici n'offre aucun avantage si elleSelect
suit immédiatementGroupBy
, car il n'y a aucune possibilité qu'il y ait un groupe vide (les groupes viennent simplement du contenu de la collection)Utilisez
Distinct()
mais gardez à l'esprit qu'il utilise le comparateur d'égalité par défaut pour comparer les valeurs, donc si vous voulez autre chose que cela, vous devez implémenter votre propre comparateur.Veuillez consulter http://msdn.microsoft.com/en-us/library/bb348436.aspx pour un exemple.
la source
Vous avez trois options ici pour supprimer l'élément en double dans votre liste:
Distinct(new DistinctItemComparer())
comme @Christian Hayter mentionné.Utilisez
GroupBy
, mais veuillez noter queGroupBy
vous devez regrouper toutes les colonnes, car si vous les regroupez,Id
cela ne supprime pas toujours les éléments en double. Par exemple, considérons l'exemple suivant:Le résultat de ce regroupement sera:
Ce qui est incorrect car il est considéré
{Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
comme un doublon. Donc, la bonne requête serait:3. Remplacer
Equal
etGetHashCode
dans la classe d'objets:Ensuite, vous pouvez l'utiliser comme ceci:
la source
Une méthode d'extension universelle:
Exemple d'utilisation:
la source
Essayez cette méthode d'extension. J'espère que cela pourrait aider.
Usage:
la source
la source
Une autre solution de contournement, pas beau acheter réalisable.
J'ai un fichier XML avec un élément appelé "MEMDES" avec deux attributs "GRADE" et "SPD" pour enregistrer les informations du module RAM. Il y a beaucoup d'articles en double dans SPD.
Voici donc le code que j'utilise pour supprimer les éléments dupliqués:
la source
Lorsque vous ne voulez pas écrire IEqualityComparer, vous pouvez essayer quelque chose comme suit.
la source