【问题标题】:Select Distinct in Linq with anonymous type在 Linq 中选择具有匿名类型的 Distinct
【发布时间】:2010-11-09 18:16:29
【问题描述】:

考虑一下这个 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);

【问题讨论】:

  • 我认为你们都错过了这里的重点。 “选择新”创建匿名类型的事实使 Distinct() 无关紧要,因此,当我将其转换为 ToDictionary 时,它会失败。

标签: c# linq anonymous-types


【解决方案1】:

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。

【讨论】:

【解决方案2】:

使用ToLookup。就是为此而生的。

【讨论】:

【解决方案3】:

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

取决于您的要求。

HTH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多