Domanda

Esiste una funzione in F # simile alla sintassi fluida LINQ per l'ordinamento per espressioni multiple:

myList.OrderBy(fun x->x.Something).ThenBy(fun x->x.SomethingElse)

Mi piacerebbe qualcosa del tipo:

myList 
|> Seq.sort_by(fun x->x.Something) 
|> Seq.then_by(fun x->x.SomethingElse)

Thx

È stato utile?

Soluzione

Usa una tupla come chiave di ordinamento:

myList |> Seq.sortBy (fun x -> x.Something, x.SomethingElse)

Altri suggerimenti

Perché sortBy è definito stabile , puoi ordinare più volte, usando le chiavi secondarie in ordine inverso:

myList |> Seq.sortBy (fun x -> x.SomethingElse) |> Seq.SortBy (fun x -> x.Something)

Gli articoli che confrontano lo stesso per la chiave primaria manterranno l'ordinamento precedente effettuato dalla chiave secondaria. Gli articoli che confrontano lo stesso per entrambi saranno nell'ordine originale. Questo ha il vantaggio (a differenza del metodo tupla) che puoi controllare se l'ordinamento sta scendendo per ciascuna delle chiavi in ??modo indipendente.

Se le chiavi di ordinamento sono numeri interi con segno e si desidera ordinare, ad esempio, la chiave secondaria in ordine decrescente, è comunque possibile utilizzare il metodo tupla utilizzando la negazione:

myList |> Seq.sortBy (fun x -> x.Something, -x.SomethingElse)

Questo metodo è probabilmente meno chiaro, ma potrebbe essere più veloce dell'ordinamento due volte. Tenere presente che non gestisce correttamente il valore più piccolo correttamente a causa dell'overflow.

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