Tôi có một truy vấn trong linqtosql mà trả về một LabelNumber:C# LINQ Tuỳ chỉnh Sắp xếp
var q = from list in db.Lists
select list.LabelNumber;
var q
sau đó trở thành một IEnumerable<string>
với các yếu tố như thế này:
{"1","2","2.A","2.B","3","3.A","3.B"}
tôi về cơ bản muốn đặt hàng các yếu tố như chúng xuất hiện ở trên, nhưng tôi không thể sử dụng OrderBy(x=>x.LabelNumber)
vì "10"
sẽ được đặt sau "1"
và trước "2"
.
Tôi cho rằng tôi phải viết một hàm so sánh tùy chỉnh, nhưng làm cách nào để làm điều này với LINQ?
Chỉnh sửa: Tôi nghĩ rằng tất cả các câu trả lời bên dưới sẽ hiệu quả, nhưng bạn phải thêm một báo trước cho tất cả các câu trả lời.
Nếu bạn đang sử dụng Linq2SQL, bạn không thể sử dụng chỉ mục mảng trong truy vấn. Để khắc phục điều này, bạn cần có hai truy vấn. Một trong đó đọc từ SQL. Thứ hai không thứ tự:
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, sắp xếp các con số theo cách bạn muốn được gọi là "loại tự nhiên". – mquander