Gruppe summiert sich in F # - einfach mit Sequenzen, ist das mit Listen möglich?

7

Angesichts einer Sequenz von Gruppen-ID / Wert-Tupeln war es einfach, Gruppensummen zu berechnen (ziemlich genau so, wie ich es mit C # und LINQ machen würde):

%Vor%

Aber da ich neu bei F # bin, kann ich keinen Weg sehen, das mit Listen so zu machen. Muss ich veränderbare Variablen verwenden, oder gibt es eine funktionale Möglichkeit, dasselbe mit Listen zu tun?

    
Sergey Aldoukhov 17.07.2011, 20:25
quelle

3 Antworten

8

Es gibt kein eingebautes List.groupBy . Eine Anzahl von F # eingebauten Typen haben Funktionen, denen die Seq-Version dieser Funktion zugewiesen ist. z.B. von list.fs

let inline sumBy f (list : list<_>) = Seq.sumBy f list

Ich bin mir ziemlich sicher, dass die Entwickler von F # viele Diskussionen darüber geführt haben, was man aus Gründen der Konsistenz kopieren soll und was man aus DRY herauslassen sollte. Ich persönlich wünsche, dass sie bei DRY bleiben.

Wenn Sie Ihre eigene "funktionale" List.groupBy erstellen möchten, würde ich map und list verwenden.

%Vor%

Sie können Listen überspringen, wenn Sie nur die Summe benötigen.

%Vor%

Ausgabe

%Vor%     
gradbot 17.07.2011, 21:00
quelle
7

Obwohl mit der Lösung von gradbot nichts falsch ist, würde ich es einfach halten und Seq.toList verwenden, um Sequenzen bei Bedarf in Listen umzuwandeln. So könnten Sie Ihre Definition wie folgt umschreiben:

%Vor%     
kvb 17.07.2011 21:51
quelle
7

Obwohl ich den Vorschlag von kvb verwenden würde, schlage ich vor, dass Sie Dictionary anstelle von Map verwenden, wenn Sie Ihre eigenen rollen möchten. In meinen Tests war es mindestens 400% schneller.

%Vor%

Oder:

%Vor%

Nach Ref-Version:

%Vor%     
Daniel 18.07.2011 03:06
quelle

Tags und Links