假设我有一个 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/