Ordenar números e cadeias mistos
Eu tenho uma lista de seqüências de caracteres que podem conter uma letra ou uma representação de seqüência de caracteres de um int (máximo de 2 dígitos). Eles precisam ser classificados em ordem alfabética ou (quando é realmente um int) no valor numérico que representa.
Exemplo:
IList<string> input = new List<string>()
{"a", 1.ToString(), 2.ToString(), "b", 10.ToString()};
input.OrderBy(s=>s)
// 1
// 10
// 2
// a
// b
O que eu quero é
// 1
// 2
// 10
// a
// b
Eu tenho uma idéia de formatação com tentar analisá-lo, então se é um tryparse bem sucedido para formatá-lo com o meu próprio formatador de string personalizado para torná-lo ter zeros anteriores. Eu estou esperando por algo mais simples e performant.
Editar
Eu acabei fazendo um IComparer que eu joguei na minha biblioteca de Utils para uso posterior.
Enquanto eu estava nisso joguei duplas no mix também.
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);
}