La somma di una proprietà specifica di tutti gli elementi in un elenco

StackOverflow https://stackoverflow.com/questions/824934

  •  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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top