Gibt es eine bessere Möglichkeit, ein Wörterbuch mithilfe von LINQ zu aggregieren?

8

Ich versuche, ein Wörterbuch aus einem Aufzählungszeichen zu erstellen, aber ich brauche einen Aggregator für alle potenziell doppelten Schlüssel. Die direkte Verwendung von ToDictionary () verursachte gelegentlich doppelte Schlüssel.

In diesem Fall habe ich eine Menge Zeiteinträge ({DateTime Date, double Hours}), und wenn mehrere Zeiteinträge am selben Tag stattfinden, möchte ich die Gesamtzeit für diesen Tag. Ein benutzerdefinierter Aggregator, der mir einen eindeutigen Schlüssel für einen Wörterbucheintrag gibt.

Gibt es einen besseren Weg, dies zu tun?

(Das funktioniert.)

%Vor%

Ich glaube, ich suche wirklich so etwas:

%Vor%

so ...

%Vor%

Der 'Resolver' könnte .First () oder .Max () oder was auch immer sein.

Oder etwas ähnliches.

Ich hatte eine Implementierung ... und eine andere kam in den Antworten auf, während ich daran arbeitete.

Meine:

%Vor%

Ich hatte gehofft, dass es so etwas schon gibt, aber ich denke nicht. Das wäre eine schöne Ergänzung.

Danke an alle: -)

    
Jonathan Mitchem 26.07.2010, 19:15
quelle

5 Antworten

5
%Vor%

Aufruf von:

%Vor%     
Amy B 26.07.2010, 19:57
quelle
3

Wenn doppelte Schlüssel ein Problem sind, meinst du vielleicht ToLookup ? Gleiches Prinzipal, aber mehrere Werte pro Schlüssel ...

%Vor%

Dann tust du einfach so etwas wie:

%Vor%

oder verwenden Sie SelectMany natürlich ( from...from ).

    
Marc Gravell 26.07.2010 19:31
quelle
0

Ich mag Ihre Methode, weil sie klar ist, aber wenn Sie sie effizienter machen wollen, können Sie Folgendes tun, was die gesamte Aggregation und Gruppierung in einem einzigen Aggregate -Anruf erledigt, wenn auch ein wenig verschachtelt.

> %Vor%     
Samuel Neff 26.07.2010 19:37
quelle
0

Suchen Sie nach so etwas?

%Vor%     
Gabe 26.07.2010 19:47
quelle
0

Wenn Sie auf den Indexer eines Wörterverzeichnisses zugreifen und dort nichts ist, können Sie festlegen, dass es eine Standard-Konstruktion des Datentyps zurückgibt, im Falle eines Double ist es 0. Ich würde vielleicht etwas wie

tun %Vor%

Gerade verwendet Liste, weil die .ForEach () -Erweiterung aus unbekannten Gründen nicht auf imenumerable implementiert ist, obwohl ich mir vorstellen würde, die Implementierung wäre Zeile für Zeile identisch, aber Sie könnten einfach ein Literal foreach () was ist es tut sowieso unter die Decke.

Ich denke, dass dies vom Standpunkt der Lesbarkeit aus viel einfacher ist, was getan werden kann, es sei denn, dies ist nicht das, was Sie versuchen wollten.

    
Jimmy Hoffa 26.07.2010 19:32
quelle