我正在尝试从一个可枚举对象中构建一个字典,但我需要一个聚合器来处理所有可能重复的键。直接使用ToDictionary()有时会导致键重复。
在这种情况下,我有一堆时间条目({ DateTime Date, double Hours }),如果同一天出现多个时间条目,则我想要该天的总时间。也就是说,我需要一个自定义的聚合器,为字典条目提供唯一的键。
是否有比这更好的方法?
(这种方法确实有效。)
我希望已经有这样的东西了,但我猜没有。这将是一个不错的补充。
谢谢大家 :-)
在这种情况下,我有一堆时间条目({ 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 */ );
so...
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);
}
我希望已经有这样的东西了,但我猜没有。这将是一个不错的补充。
谢谢大家 :-)