J'essaie de construire un dictionnaire d'une énorme, mais j'ai besoin d'un agrégateur pour toutes les clés potentiellement dupliquées. L'utilisation de Todimicatrice () a directement causé parfois des touches en double.
Dans ce cas, j'ai un tas d'entrées de temps ({DateTime Date, Double heures}), et si plusieurs entrées de temps se produisent le même jour, je veux le total Temps pour ce jour. I.e., un agrégateur personnalisé, qui me donnera une clé unique pour une entrée de dictionnaire. P>
Y a-t-il une meilleure façon de le faire que cela? p>
(cela fonctionne.) P>
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); }
5 Réponses :
Si les clés en double sont un problème, vous voulez peut-être dire alors vous faites simplement quelque chose comme: p> ou utilisez TolOookUp CODE>? Même principal, mais plusieurs valeurs par clé ...
SELECTMANY code> bien sûr (
de ... de code>). p> p>
Si vous accédez à l'indexeur d'un dictionnaire et il n'y a rien là-bas, il vous permet de définir qu'il renvoie une construction par défaut du type de données, dans le cas d'un double ce sera 0. Je ferais peut-être quelque chose comme
public void blabla(List<TimeEntry> hoho) { Dictionary<DateTime, double> timeEntries = new Dictionary<DateTime, double>(); hoho.ForEach((timeEntry) => { timeEntries[timeEntry.Day] = 0; }); hoho.ForEach((timeEntry) => { timeEntries[timeEntry.Day] += timeEntry.Hours; }); }
Génère KeyNotFoundException: la clé donnée n'était pas présente dans le dictionnaire code> sur le
TIMENTRIES [] + = code> appel. Vous devez initialiser la valeur du dictionnaire avant de pouvoir utiliser + = dessus.
J'aime votre méthode parce que c'est clair, mais vous voulez le rendre plus efficace, vous pouvez effectuer ce qui suit qui effectuera toutes les agrégations et regrouper dans un seul appel code> appel code>, mais un.
private static Dictionary<DateTime, double> CreateAggregatedDictionaryByDate(IEnumerable<TimeEntry> timeEntries) { return timeEntries.Aggregate(new Dictionary<DateTime, double>(), (accumulator, entry) => { double value; accumulator.TryGetValue(entry.Date, out value); accumulator[entry.Date] = value + entry.Hours; return accumulator; }); }
Agréable. Un peu compliqué ... mais oui. Je suppose que je ne suis pas vraiment sûr de ce que je cherche. Peut-être une surcharge pour Todimicatrice () qui fournit un troisième paramètre pour résoudre des doublons?
cherchez-vous quelque chose comme ça?
Ouais, c'est exactement ce que j'ai, juste avec la syntaxe de la méthode de l'extension.
Le mien est différent en ce qu'il met l'agrégat dans l'appel code> code> code> plutôt que de l'informer en premier.
Dictionary<DateTime, double> result = timeEntries.ToDictionary( te => te.Date, te => te.Hours, g => g.Sum() );
Voulez-vous dire que vous souhaitez purifier la clé ou voulez-vous supprimer les DUPS?
J'ai mis à jour la description. Essayer d'agréger les doublons pour les rendre uniques, puis construire un dictionnaire de cela.