Sortowanie mieszanych liczb i łańcuchów

Mam listę łańcuchów, które mogą zawierać literę lub ciąg znaków reprezentujących int (maksymalnie 2 cyfry). Muszą być posortowane alfabetycznie lub (gdy jest to rzeczywiście int) na wartości liczbowej, którą reprezentuje.

Przykład:

<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>

Chciałbym tylko

<code>  // 1
  // 2
  // 10
  // a
  // b
</code>

Mam pewien pomysł polegający na sformatowaniu go za pomocą próby parsowania go, a następnie, jeśli jest to udana próba sformatowania go za pomocą własnego niestandardowego formatu ciągu znaków, aby mieć poprzednie zera. Mam nadzieję na coś prostszego i bardziej wydajnego.

Edytować
Skończyło się na tym, że stworzyłem IComparer, który wrzuciłem do mojej biblioteki Utils do późniejszego użycia.
W tym czasie rzuciłem w miksie także podwójnie.

<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>

questionAnswers(10)

yourAnswerToTheQuestion