Tôi cố gắng để xây dựng một từ điển từ đếm được, nhưng tôi cần một aggregator cho tất cả các phím có khả năng lặp lại. Sử dụng ToDictionary() trực tiếp thỉnh thoảng gây ra các khóa trùng lặp.Có cách nào tốt hơn để tổng hợp từ điển bằng LINQ không?
Trong trường hợp này, tôi có một loạt các mục nhập thời gian ({DateTime Date, double Hours}) và nếu nhiều mục nhập thời gian xuất hiện trong cùng một ngày, tôi muốn tổng thời gian cho ngày đó. Tức là, một tập hợp tùy chỉnh, sẽ cung cấp cho tôi khóa duy nhất cho mục nhập từ điển.
Có cách nào tốt hơn để thực hiện việc này không?
(Điều này không làm việc.)
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);
}
Tôi nghĩ rằng tôi đang thực sự tìm kiếm một cái gì đó như thế này:
IEnumerable<T>.ToDictionary(
/* key selector : T -> TKey */,
/* value selector : T -> TValue */,
/* duplicate resolver : IEnumerable<TValue> -> TValue */);
như vậy ...
timeEntries.ToDictionary(
te => te.Date,
te => te.Hours,
duplicates => duplicates.Sum());
Các 'resolver 'có thể là .irst() hoặc .Max() hoặc bất kỳ thứ gì.
Hoặc một cái gì đó tương tự.
Tôi đã có một triển khai ... và một số khác xuất hiện trong các câu trả lời trong khi tôi đang thực hiện.
Mine:
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);
}
Tôi đã hy vọng có một cái gì đó như thế đã có, nhưng tôi đoán không. Đó sẽ là một bổ sung tốt đẹp.
Cảm ơn tất cả mọi người :-)
Bạn có nghĩa là bạn muốn uniquify chìa khóa, hay bạn muốn loại bỏ các dups? – Abel
Tôi đã cập nhật mô tả. Cố gắng tổng hợp các bản sao để làm cho chúng trở thành duy nhất và sau đó xây dựng một từ điển từ đó. –