gpt4 book ai didi

c# - 有没有更好的方法来使用 LINQ 聚合字典?

转载 作者:太空狗 更新时间:2023-10-29 18:33:22 25 4
gpt4 key购买 nike

我正在尝试从可枚举对象构建字典,但我需要一个用于所有可能重复的键的聚合器。直接使用 ToDictionary() 偶尔会导致重复键。

在这种情况下,我有一堆时间条目 ({ DateTime Date, double Hours }),如果同一天出现多个时间条目,我想要当天的总时间。即,一个自定义聚合器,它会给我一个字典条目的唯一键。

还有比这更好的方法吗?

(这确实有效。)

    private static Dictionary<DateTime, double> CreateAggregatedDictionaryByDate( IEnumerable<TimeEntry> timeEntries )
{
return
timeEntries
.GroupBy(te => new {te.Date})
.Select(group => new {group.Key.Date, Hours = group.Select(te => te.Hours).Sum()})
.ToDictionary(te => te.Date, te => te.Hours);
}

我想我真的在寻找这样的东西:

IEnumerable<T>.ToDictionary( 
/* key selector : T -> TKey */,
/* value selector : T -> TValue */,
/* duplicate resolver : IEnumerable<TValue> -> TValue */ );

所以...

timeEntries.ToDictionary( 
te => te.Date,
te => te.Hours,
duplicates => duplicates.Sum() );

“解析器”可以是 .First() 或 .Max() 或其他。

或类似的东西。


我有一个实现...而另一个在我处理它时出现在答案中。

我的:

    public static Dictionary<TKey, TValue> ToDictionary<T, TKey, TValue>(
this IEnumerable<T> input,
Func<T, TKey> keySelector,
Func<T, TValue> valueSelector,
Func<IEnumerable<TValue>, TValue> duplicateResolver)
{
return input
.GroupBy(keySelector)
.Select(group => new { group.Key, Value = duplicateResolver(group.Select(valueSelector)) })
.ToDictionary(k => k.Key, k => k.Value);
}

我希望已经有类似的东西了,但我想没有。那将是一个很好的补充。

谢谢大家:-)

最佳答案

public static Dictionary<KeyType, ValueType> ToDictionary
<SourceType, KeyType, ValueType>
(
this IEnumerable<SourceType> source,
Func<SourceType, KeyType> KeySelector,
Func<SourceType, ValueType> ValueSelector,
Func<IGrouping<KeyType, ValueType>, ValueType> GroupHandler
)
{
Dictionary<KeyType, ValueType> result = source
.GroupBy(KeySelector, ValueSelector)
.ToDictionary(g => g.Key, GroupHandler);
}

调用者:

Dictionary<DateTime, double> result = timeEntries.ToDictionary(
te => te.Date,
te => te.Hours,
g => g.Sum()
);

关于c# - 有没有更好的方法来使用 LINQ 聚合字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3338166/

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