.net - 如何生成完全唯一的查找?

标签 .net linq

假设我有一个 IEnumerable 键/值对,其中包含重复项。如果我对其调用 ToLookup 并传递选择键和值的 lambda,我最终会得到一个 Lookup,其中所有键都是唯一的,但列表值可以包含重复项。有没有什么好方法可以在单个 LINQ 查询语句中以 Lookup 结束,其中所有值列表都不包含重复项?

我无法在原始序列上调用 Distinct ,因为元素按值重复,但不按对象标识重复,并且 Distinct 不接受 lambda我可以使用的选择器。

最佳答案

您可以在与多个选择组合构建查找之前使用 GroupBy。然而,这感觉不太好:

类似这样的事情:

sequence.GroupBy(kvp => _getKey(kvp))
        .SelectMany(grp => grp.Distinct()
                              .Select(value => new { grp.Key, Value = value}))
        .ToLookUp(grp => grp.Key, grp=> grp.Value);

替代方案是使用字典,因为我不太确定为什么要使用查找。

sequence.GroupBy(kvp => _getKey(kvp))
        .Select(g => new { g.Key, Values = new HashSet<WhatEver>(g)})
        .ToDictionary(v => v.Key, v => v.Values);

哈希集的替代方案是提供 EqualityComparer使用 Distinct()

 public sealed class WhatEverComparer : IEqualityComparer<WhatEver>
 {
    ... implement interface..
 }

然后

sequence.GroupBy(kvp => _getKey(kvp))
        .Select(g => new { g.Key, Values = g.Distinct(new WhatEvercomparer()).ToArray()})
        .ToDictionary(v => v.Key, v => v.Values);

关于.net - 如何生成完全唯一的查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30178491/

相关文章:

c# - Linq 选择在哪里

c# - Linq 在自动同步的主键字段上插入

c# - Linq 填充类的值

C# 代码设计 : 1 library, 2 个项目使用它(但其中一个是只读的)

c# - 使用 Roslyn(csc.exe) 以 .NET 3.5 为目标时手动编译 C#

c# - 上传速度问题: HttpWebRequest

.net - Linux 的事务范围

c# - 从 IL 构造方法引用集合

c# - Linq 与 Lambda 等效于 SQL

c# - 当 Where 子句在 Linq 语句内部使用时产生的结果与在外部使用时不同