La somma di una proprietà specifica di tutti gli elementi in un elenco
-
05-07-2019 - |
Domanda
Prendi il seguente esempio,
Ho una lezione
public class SomeItem
{
public string Name;
public DateTime Published;
public uint16 Size;
}
Ho un List<SomeItem>
e voglio calcolare la dimensione totale di tutti gli articoli.
In C # scrivo semplicemente
var totalSize = items.Sum((i) => i.Size);
Ho dato un'occhiata alle funzioni Elenco in F # ma si lamentano sempre dei tipi.
Come lo scriveresti in F #?
(Ho provato i motori di ricerca, ma il supporto dei motori di ricerca per F # è terribile)
Soluzione
Supponendo che tu abbia un valore di tipo IEnumerable<Item>
, puoi utilizzare sum_by
dal modulo Seq
:
let totalSize = items |> Seq.sum_by (fun (i : Item) -> i.Size)
Nota che il tipo Microsoft.FSharp.Collections.List<T>
di F # non è la stessa classe a cui potresti essere abituato da System.Collections.Generic.List<T>
e non sono intercambiabili. Tuttavia, i metodi nel modulo IEnumerable<T>
funzionano su qualsiasi <=> e <=> è lo stesso tra F # e C #.
Altri suggerimenti
let totalSize = items |> List.sum_by (fun i -> i.Size)
LINQ funziona bene anche in F #, ma probabilmente è meglio usare la comprensione dell'elenco come sopra, poiché è più nella tradizione funzionale (e funziona anche leggermente più veloce perché non usa IEnumerable<T>
).
Questo è " pieghevole " in F # e altri linguaggi funzionali. Cerca esempi di Seq.fold.