Ich habe eine Abfrage in LinqToSql, die eine LabelNumber zurückgibt:C# Linq Custom Sort
var q = from list in db.Lists
select list.LabelNumber;
var q
dann eine IEnumerable<string>
mit Elementen wie dies zu:
{"1","2","2.A","2.B","3","3.A","3.B"}
ich im Grunde die Elemente bestellen möchten als sie erscheinen oben, aber ich kann die OrderBy(x=>x.LabelNumber)
nicht verwenden, weil "10"
nach "1"
und vor "2"
platziert werden würde.
Ich nehme an, ich muss eine benutzerdefinierte Komparatorfunktion schreiben, aber wie mache ich das mit Linq?
Edit: Ich denke, alle Antworten unten funktionieren, aber ein Vorbehalt muss zu allen Antworten hinzugefügt werden.
Wenn Sie Linq2SQL verwenden, können Sie keine Array-Indizes innerhalb der Abfrage verwenden. Um dies zu vermeiden, sollten Sie zwei Abfragen haben. Eine, die aus SQL liest. Die zweite funktioniert die Bestellung:
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, sortieren die Zahlen, wie Sie wollen, wird eine "natürliche Art" genannt. – mquander