2010-11-09 6 views
1

Envisagez cette requête LINQ. Il en résulte une erreur quand un blobID.Key donné apparaît plus d'un.Sélectionnez Distinct dans Linq avec le type anonyme

Y at-il un moyen d'ajouter distinct ici pour le convertir en dictionnaire de manière sûre?

var temp = (from blobID in blobIds 
      join blob in blobs on blobID.Value.HashKey 
      equals blob.HashKey 
      select new { blobID.Key, 
          Binder = Load(blob)} 
      ).ToDictionary(arg => arg.Key, arg => arg.Binder); 
+0

Je pense que vous manquez tous le point ici. le fait que le "select new" crée un type anonyme rend le Distinct() non pertinent, par conséquent, quand je le convertis en ToDictionary, il échoue. –

Répondre

2

Object.Equals est surchargée pour les classes anonymes afin que vous pouvez simplement utiliser Enumerable.Distinct:

var temp = (from blobID in blobIds 
      join blob in blobs on blobID.Value.HashKey equals blob.HashKey 
      select new { 
       blobID.Key, 
       Binder = Load(blob) 
      } 
      ).Distinct() 
      .ToDictionary(arg => arg.Key, arg => arg.Binder); 

Ici, Distinct utilisera le comparateur égalité Default pour la classe anonyme. Le comparateur d'égalité Default pour une classe anonyme utilise Object.Equals qui est ignoré pour renvoyer true si toutes les propriétés sont égales.

+0

Heres un lien pour plus d'informations, http://msdn.microsoft.com/en-us/vcsharp/aa336748.aspx#ToDictionary contient également de nombreux autres exemples utiles – Gage

0

Oui, ce serait un problème avec le dictionnaire puisque la clé doit être unique. Vous pourriez envisager d'utiliser une autre structure pour stocker les données (une liste) qui n'ont pas cette exigence, ou vous pourriez essayer Distinct() comme @Jason mentionné, ou potentiellement grouper par la clé, et créer un dictionnaire du groupe. De cette façon, la clé est unique et vous stockez une collection de toutes les entrées avec cette clé donnée.

Dépend de vos besoins.

HTH.

1

Utilisez ToLookup. C'était fait pour ça.

+1

http://msdn.microsoft.com/en-us/ library/system.linq.enumerable.tolookup (v = VS.90) .aspx ToLookup MSDN – Gage

Questions connexes