Requête LINQ avec Distinct et Union
J'ai actuellement 2 requêtes qui retournent des listes de Monmodèle comme ceci:
var q1 = ....
select new MyModel()
{
TheData1 = ...
TheData2 = ...
TheUniqueID = ...
}
var q2 = ....
select new MyModel()
{
TheData1 = ...
TheData2 = ...
TheUniqueID = ...
}
Si en t1 j'ai:
TheUniqueID = 2,3,6,9,11
et en t2 j'ai:
TheUniqueID = 2,4,7,9,12
Comment écrire la requête en sorte que je reçois une liste de Monmodèle où
TheUniqueID = 2,3,4,6,7,9,11,12
En d'autres termes, chaque TheUniqueID est présent qu'une seule fois (c'est à dire. 2 et 9 de ne pas répéter).
J'ai commencé à regarder à l'Union et distinctes, mais je me demande si j'ai besoin de 2 de déclarations ou pas.
Toutes les suggestions sont les bienvenues.
source d'informationauteur frenchie
Vous devez vous connecter pour publier un commentaire.
Je pense que frenchie veut une liste de
MyModel
en arrière au lieu de juste leTheUniqueID
.Vous avez besoin pour créer un
MyModelTheUniqueIDComparer
de classe et de passer une nouvelle instance de la comme second argument enUnion
:Ensuite, vous pouvez appeler pour obtenir le résultat:
Voir http://msdn.microsoft.com/en-us/library/bb358407.aspx pour plus de détails.
Mise à jour:
Essayez ceci:
Et d'essai avec ceci:
Assurez-vous d'avoir
using System.Linq;
Union
crée une Énumération avec les valeurs uniques de ces deux collections. En d'autres termes, vous n'avez pas besoinDistinct
.edit: exemple de l'Union ici
edit2: vous avez oublié que ce n'est pas la liste de
UniqueIDs
que vous êtes à la concaténation. J'ai enlevé le suggère code depuis qu'il a été mauvais. Vous devriez être en mesure de faire un simpleUnion
si vous implémentez unIEqualityComparer
mais que peut-être exagéré.Comme l'a souligné si vous combinez les listes avec
.Union(
) vous devrez définir l'unicité par l'aide de la surcharge de passer un IEqualityComparer pour votre type.autrement, et plus facile que vous pourriez utiliser
DistinctBy( x=> x.TheUniqueId)
de la MoreLinq projet:Inefficace seule ligne de réponse sans IEqualityComparerer
À l'aide de MoreLinq code source comme source d'inspiration, ce sera de donner une liste unique:
Réponse courte (la OrderBy n'est pas nécessaire, mais si ce n'est pas la réponse vient comme 2,3,6,9,11,4,7,12):
Réponse complète:
Remarque: par rapport à l'utilisation d'un IEqualityComparer pour la vitesse - 10000 fois pour chaque
698 ns pour Concat
100 ns pour IEqualityComparer
développé dans LinqPad