C#, linq question de l'union
Quelqu'un pourrait-il expliquer comment Union
dans LINQ travail?
Il est dit qu'il fusionne deux séquences et supprime les doublons.
Mais je peux en quelque sorte personnaliser la suppression des doublons comportement - disons que si je souhaite utiliser l'élément de the second sequence
en cas de double ou de the first sequence
.
Ou même si je souhaite quelque sorte de combiner ces valeurs dans la séquence obtenue?
Comment devrait être mis en œuvre?
Mise à jour
Je suppose que je l'ai décrit le problème de manière incorrecte, disons que nous avons une certaine valeur:
class Value {
String name
Int whatever;
}
et de la comparer utilisés effectue une x.name == y.name
vérifier.
Et disons que parfois je sais que je devrais prendre l'élément à partir de la deuxième séquence, parce que c'est whatever
champ est plus récent /mieux que le whatever
champ de la première séquence.
De toute façon, je voudrais utiliser le sequence1.Union(sequence2)
ou sequence2.Union(sequence1)
variation des méthodes.
Merci
OriginalL'auteur Yippie-Ki-Yay | 2010-12-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
second.Union(first)
au lieu defirst.Union(second)
. De cette façon, elle permet de conserver les éléments desecond
plutôt que les éléments defirst
.OriginalL'auteur Thomas Levesque
Ainsi, les éléments de la séquence que vous utilisez comme la gauche paramètre de prendre la priorité sur les éléments de droite du paramètre.
La chose la plus importante à ce sujet est qu'il est bien défini et documenté comportement, et non juste un détail d'implémentation qui pourrait changer dans la prochaine version de .net.
Comme une note lorsque vous implémentez une
IEqualityComparer<T>
il est important d'utiliser cohérenteEquals
etGetHashCode
. Et dans ce cas je préfère explicitement la fourniture d'un comparateur d'égalité à la méthode de l'union au lieu d'avoir leEquals
de l'objet lui-même de retourtrue
pour les objets qui ne sont pas identiques pour tous les usages.OriginalL'auteur CodesInChaos
Si les éléments sont doubles, alors il n'est pas question que la liste de départ - à moins que votre comparateur d'égalité ne prend pas toutes les propriétés de l'élément en compte, bien sûr.
Si elles ne sont pas vraiment les doublons puis ils vont dans la résultante de l'union.
Mise à JOUR
De vos nouvelles coordonnées au minimum, vous devriez écrire un nouvel opérateur d'égalité qui prend
whatever
en compte. Vous ne pouvez pas utilisersequence1.Union(sequence2)
ousequence2.Union(sequence1)
sauf tous les éléments veux enlever un, de la séquence ou de l'autre.À l'extrême, vous devrez écrire votre propre
Union
méthode d'extension qui le fait pour vous.IEquatable<T>
(ou l'OP explicitement spécifié comparateur d'égalité), il est possible que la comparaison ne prend pas tous les membres en compte.c'était implicite dans ma réponse. Peut-être que je devrais le faire plus explicite.
En fait j'ai posté mon commentaire avant j'ai vu ton edit...
mon montage a été invité par votre commentaire, mais dans les 5 minutes 😉
OriginalL'auteur ChrisF