使用匿名类型在Linq中选择Distinct

时间:2010-11-09 18:16:29

标签: c# linq anonymous-types

考虑这个LINQ查询。当给定的blobID.Key出现多于一个时,会导致错误。

有没有办法在这里添加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)}
           ).ToDictionary(arg => arg.Key, arg => arg.Binder);

3 个答案:

答案 0 :(得分:2)

Object.Equals被重写为匿名类,因此您只需使用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);

在这里,Distinct将使用Default等式比较器来表示匿名类。匿名类的Default相等比较器使用Object.Equals,如果所有属性相等,则覆盖它以返回true。

答案 1 :(得分:1)

使用ToLookup。它是为此而制造的。

答案 2 :(得分:0)

是的,这将是字典的一个问题,因为密钥必须是唯一的。您可以考虑使用另一种结构来存储没有该要求的数据(列表),或者您可以尝试使用@Jason提到的Distinct(),或者可能按键分组,并创建该组的字典。这样,密钥是唯一的,您可以使用给定密钥存储所有条目的集合。

取决于您的要求。

HTH。