Introduzione
La trasformazione di Schwartzian - anche conosciuta come map-sort-map o decorare-ordinamento-undecorato (DSU) -, attribuito a Randal Schwartz della comunità Perl , ordina gli elementi di un elenco o di un array in base a una metrica che associa ogni elemento al suo "valore di ordinamento".
Esempio per coloro che non hanno familiarità con la trasformazione di Schwartzian
Ad esempio in Python 2.4 e versioni successive, sia la funzione sorted()
che il metodo sul posto list.sort()
richiedono un parametro key
che ci consente di fornire una speciale "funzione chiave" .
Questa funzione viene semplicemente chiamata su ogni elemento dell'elenco prima di effettuare confronti e quindi evita di calcolare il valore del criterio ogni volta in modo intelligente.
In altre parole, l'ordinamento di un elenco (Python) di stringhe maiuscole e minuscole:
>>> sortList = ["the", "Schwartzian", "Transform", "rocks"]
>>> sortList.sort(key = lambda e: e.lower())
['rocks', 'Schwartzian', 'the', 'Transform']
Questo potrebbe anche essere suddiviso in 3 passaggi di base Schwartz suggerisce:
#1: Turn the list into an array of references to pairs
>>> temp = [(e.upper(), e) for e in sortList]
>>> temp
[('THE', 'the'), ... , ('TRANSFORM', 'Transform'), ('ROCKS', 'rocks')]
#2: Sort this list by the second elements
>>> temp.sort()
#3: Turn the sorted list back into one one value list
>>> sortList = [e[1] for e in temp]
>>> sortList
['rocks', 'Schwartzian', 'the', 'Transform']
La domanda
Ora mi chiedo se altri linguaggi di programmazione ben noti come C ++, C # 1) , Java, JavaScript, VisualBasic e così via forniscano a Schwartzian anche la trasformazione come interfaccia o sia una "soluzione" (una propria implementazione piuttosto che una funzionalità linguistica), è necessario invece come questo esempio in C #:
var unsorted = new string[] { "the", "Schwartzian", "Transform", "rocks"};
var sorted = unsorted.Select(word => new { word, lower = word.ToLower() })
.OrderBy(t => t.lower)
.Select(t => t.word)
.ToArray();
1) Per quanto ne so è possibile utilizzare la sintassi Linq