Sorting mixed numbers and strings
c#, formatting, sorting, tostring
Solution
Perhaps you could go with a more generic approach and use a natural sorting algorithm such as the C# implementation here.
Problem
I have a list of strings that can contain a letter or a string representation of an int (max 2 digits). They need to be sorted either alphabetically or (when it is actually an int) on the numerical value it represents. Example: ``` IList<string> input = new List<string>() {"a", 1.ToString(), 2.ToString(), "b", 10.ToString()}; input.OrderBy(s=>s) // 1 // 10 // 2 // a // b ``` What I would want is ``` // 1 // 2 // 10 // a // b ``` I have some idea involving formatting it with trying to parse it, then if it is a successfull tryparse to format it with my own custom stringformatter to make it have preceding zeros. I'm hoping for something more simple and performant. Edit I ended up making an IComparer I dumped in my Utils library for later use. While I was at it I threw doubles in the mix too. ``` 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); } ```