Tengo una consulta en LinqToSql que devuelve un LabelNumber:C# LINQ orden personalizado
var q = from list in db.Lists
select list.LabelNumber;
var q
entonces se convierte en un IEnumerable<string>
con elementos como este:
{"1","2","2.A","2.B","3","3.A","3.B"}
Básicamente quiero ordenar los elementos como aparecen arriba, pero no puedo usar el OrderBy(x=>x.LabelNumber)
porque "10"
se colocará después de "1"
y antes de "2"
.
Supongo que tengo que escribir una función de comparador personalizada, pero ¿cómo hago esto con linq?
Editar: Creo que todas las respuestas a continuación funcionarán, pero se debe agregar una advertencia a todas las respuestas.
Si está utilizando Linq2SQL no puede usar índices de matriz dentro de la consulta. Para superar esto, debe tener dos consultas. Uno que lee de SQL. El segundo hace el pedido:
var q = from list in db.Lists
select list.LabelNumber;
var q2 = q.AsEnumerable()
.OrderBy(x => int.Parse(x.LabelNumber.Split('.')[0]))
.ThenBy(x => x.Number
.Contains(".") ?
x.LabelNumber.Split('.')[1].ToString()
:
string.Empty);
Para su información, ordenar los números de la manera que desee se denomina "clasificación natural". – mquander