Ho una lista di stringhe che possono contenere una lettera o una rappresentazione di stringa di un int (max 2 cifre). Devono essere ordinati alfabeticamente o (quando è effettivamente un int) sul valore numerico che rappresenta.Ordinamento di numeri misti e stringhe
Esempio:
IList<string> input = new List<string>()
{"a", 1.ToString(), 2.ToString(), "b", 10.ToString()};
input.OrderBy(s=>s)
// 1
// 10
// 2
// a
// b
quello che vorrei è
// 1
// 2
// 10
// a
// b
ho qualche idea che coinvolgono formattarlo con il tentativo di analizzarlo, poi, se si tratta di un TryParse successo per formattare con il mio possedere il proprio stringformatter personalizzato per renderlo preceduto da zeri. Sto sperando in qualcosa di più semplice e performante.
Modifica
ho finito per fare un IComparer Buttai nella mia libreria Utils per un uso successivo.
Mentre ero lì ho buttato anche il doppio nel mix.
public class MixedNumbersAndStringsComparer : IComparer<string> {
public int Compare(string x, string y) {
double xVal, yVal;
if(double.TryParse(x, out xVal) && double.TryParse(y, out yVal))
return xVal.CompareTo(yVal);
else
return string.Compare(x, y);
}
}
//Tested on int vs int, double vs double, int vs double, string vs int, string vs doubl, string vs string.
//Not gonna put those here
[TestMethod]
public void RealWorldTest()
{
List<string> input = new List<string>() { "a", "1", "2,0", "b", "10" };
List<string> expected = new List<string>() { "1", "2,0", "10", "a", "b" };
input.Sort(new MixedNumbersAndStringsComparer());
CollectionAssert.AreEquivalent(expected, input);
}
cool.lo avrei usato se lo avessi saputo prima: P –
Davvero fantastico, ho appena trovato un wrapper Delphi anche per questo http://irsoft.de/web/strnatcmp-and-natsort-for-delphi –
Questo non funzionerà in tutti i casi . Supponiamo che ypu abbia il seguente elenco di elementi: "0/30" "0/248" "0/496" "0/357.6". Questo ordine sarà keept dopo l'ordinamento, che non è quello che ci si potrebbe aspettare. –