Sortieren von gemischten Zahlen und Zeichenfolgen
Ich habe eine Liste von Zeichenfolgen, die einen Buchstaben oder eine Zeichenfolgendarstellung eines Int (maximal 2 Ziffern) enthalten können. Sie müssen entweder alphabetisch oder (wenn es sich tatsächlich um ein int handelt) nach dem numerischen Wert sortiert werden, den sie darstellen.
Beispiel:
<code>IList<string> input = new List<string>() {"a", 1.ToString(), 2.ToString(), "b", 10.ToString()}; input.OrderBy(s=>s) // 1 // 10 // 2 // a // b </code>
Was ich möchte, ist
<code> // 1 // 2 // 10 // a // b </code>
Ich habe eine Idee, wie ich es formatieren soll, indem ich versuche, es zu analysieren. Wenn es dann ein erfolgreicher Tryparse ist, formatiere ich es mit meinem eigenen benutzerdefinierten String-Formatierer, damit es vorangestellte Nullen hat. Ich hoffe auf etwas Einfacheres und Performanteres.
Bearbeiten
Am Ende habe ich einen IComparer erstellt, den ich zur späteren Verwendung in meiner Utils-Bibliothek abgelegt habe.
Während ich dabei war, warf ich auch Doppel in die Mischung.
<code>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); } </code>