gpt4 book ai didi

Linq:创建空的 IGrouping

转载 作者:行者123 更新时间:2023-12-01 11:55:05 25 4
gpt4 key购买 nike

我想使用 Linq 创建一个函数来汇总传入的值序列。该函数应如下所示:

IDictionary<TKey, Summary<TKey>> Summarize<TKey, TValue>(IEnumerable<TValue> values)
{
return values
.ToLookup(val => GetKey(val)) // group values by key
.Union(*an empty grouping*) // make sure there is a default group
.ToDictionary(
group => group.Key,
group => CreateSummary(group)); // summarize each group
}

问题是生成的 IDictionary 应该有一个 default(TKey) 条目,即使传入的序列不包含该键的值。这可以以纯粹的功能方式完成吗? (不使用可变数据结构。)

我能想到的唯一方法是调用 .Union 在查找之前将其管道化到字典中。但这需要我创建一个空的 IGrouping,如果没有明确的类,这似乎是不可能的。有没有一种优雅的方法来做到这一点?

编辑:我们可以假设 TKey 是一种值类型。

最佳答案

您无法从 GroupBy 或 ToLookup 获取空组。或许是有意为之。

Can this be done in a purely functional way? (Not using mutable data structures.)



虽然这样的学术要求可能很有趣,但任何解决方案都应该与直接实现的简单性进行比较。
Dictionary<TKey, Summary<TKey>> result = values
.GroupBy(val => GetKey(val))
.ToDictionary(g => g.Key, g => CreateSummary(g));

TKey x = default(TKey);
if (!result.ContainsKey(x))
{
result[x] = CreateSummary(Enumerable.Empty<TValue>());
}

return result;

现在如果你想要一个空组,只需为它添加一个类:
public class EmptyGroup<TKey, TValue> : IGrouping<TKey, TValue>
{
public TKey Key {get;set;}

public IEnumerator GetEnumerator()
{
return GetEnumerator<TValue>();
}
public IEnumerator<TValue> GetEnumerator<TValue>()
{
return Enumerable.Empty<TValue>().GetEnumerator<TValue>();
}
}

像这样使用:
EmptyGroup<TKey, TValue> empty = new EmptyGroup<TKey, TValue>(Key = default<TKey>());

关于Linq:创建空的 IGrouping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8046425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com