Sto cercando di creare un dizionario da una enumerabile, ma ho bisogno di un aggregatore per tutte le chiavi potenzialmente duplicate. L'uso diretto di ToDictionary() causava occasionalmente chiavi duplicate.C'è un modo migliore per aggregare un dizionario usando LINQ?
In questo caso, ho un certo numero di voci di tempo ({DateTime Date, double Hours}), e se più voci temporali si verificano nello stesso giorno, voglio il tempo totale per quel giorno. Ad esempio, un aggregatore personalizzato, che mi darà una chiave univoca per una voce del dizionario.
C'è un modo migliore per farlo rispetto a questo?
(Questo funziona.)
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);
}
Penso che sto davvero cercando qualcosa di simile:
IEnumerable<T>.ToDictionary(
/* key selector : T -> TKey */,
/* value selector : T -> TValue */,
/* duplicate resolver : IEnumerable<TValue> -> TValue */);
così ...
timeEntries.ToDictionary(
te => te.Date,
te => te.Hours,
duplicates => duplicates.Sum());
Il 'resolver 'potrebbe essere .First() o .Max() o qualsiasi altra cosa.
O qualcosa di simile.
Ho avuto un'implementazione ... e un'altra è comparsa nelle risposte mentre ci stavo lavorando.
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);
}
Speravo ci fosse qualcosa di simile già, ma io non credo. Sarebbe una bella aggiunta.
Grazie a tutti :-)
Vuoi dire che si desidera uniquify la chiave, o si desidera rimuovere i dups? – Abel
Ho aggiornato la descrizione. Cercando di aggregare i duplicati per renderli unici, e quindi creare un dizionario da questo. –