ho una query in LinqToSql che restituisce un LabelNumber:C# LINQ Ordinamento personalizzato
var q = from list in db.Lists
select list.LabelNumber;
var q
poi diventa un IEnumerable<string>
con elementi come questo:
{"1","2","2.A","2.B","3","3.A","3.B"}
Io fondamentalmente voglio ordinare gli elementi come appaiono sopra, ma non posso usare il OrderBy(x=>x.LabelNumber)
perché "10"
si posizionerebbe dopo "1"
e prima di "2"
.
Suppongo di dover scrivere una funzione di confronto personalizzata, ma come faccio a farlo con linq?
Modifica: Penso che tutte le risposte seguenti funzioneranno, ma è necessario aggiungere un avvertimento a tutte le risposte.
Se si utilizza Linq2SQL non è possibile utilizzare gli indici di array all'interno della query. Per superare questo, dovresti avere due domande. Uno che legge da SQL. Il secondo fa l'ordine:
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);
FYI, l'ordinamento dei numeri nel modo desiderato è chiamato "tipo naturale". – mquander