Tengo una lista de cadenas que pueden contener una letra o una cadena de una int (max 2 dígitos). Deben ordenarse alfabéticamente o (cuando en realidad es un int) en el valor numérico que representa.Ordenando números y cadenas mixtas
Ejemplo:
IList<string> input = new List<string>()
{"a", 1.ToString(), 2.ToString(), "b", 10.ToString()};
input.OrderBy(s=>s)
// 1
// 10
// 2
// a
// b
Lo que yo quiero es
// 1
// 2
// 10
// a
// b
tengo una idea que implica formatearlo con tratar de analizarlo, a continuación, si es un TryParse exitosa para formatearlo con mi propio formato de cadena personalizado para que tenga ceros precedentes. Espero algo más simple y eficiente.
Editar
terminé haciendo un IComparer Me deshice de mi biblioteca Utilidades para su uso posterior.
Mientras estaba en eso, lancé dobles en la mezcla también.
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);
}
genial.lo hubiera usado si se hubiera hecho antes: P –
Muy bien, acabo de encontrar un envoltorio Delphi para esto también http://irsoft.de/web/strnatcmp-and-natsort-for-delphi –
Esto no funcionará en todos los casos . Suponga que ypu tiene la siguiente lista de elementos: "0/30" "0/248" "0/496" "0/357.6". Esta orden será guardada después de la clasificación, que no es lo que puede esperar. –