열거 형에서 사전을 작성하려고하지만 모든 중복 키가있는 집계가 필요합니다. ToDictionary()를 직접 사용하면 때때로 중복 키가 발생합니다.LINQ를 사용하여 사전을 집계하는 더 좋은 방법이 있습니까?
이 경우 시간 항목 ({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);
}
. 그건 좋은 추가 것입니다.
당신이 키를 uniquify 할, 또는 당신이 DUPS을 제거 할 할 것을 의미합니까? – Abel
설명이 업데이트되었습니다. 고유 한 것을 만들기 위해 중복을 모으고, 그로부터 사전을 만든다. –