2011-12-19 22 views
7

Tôi đã tìm kiếm một giải pháp cho điều này một thời gian.IComparer để phân loại tự nhiên

Khi tôi sắp xếp dưới đây sử dụng một chuỗi loại tôi có một danh sách:

10 
10b 
1111 
1164 
1174 
23 
23A 
23B 
23D 
23E 

Tôi thực sự muốn trong danh sách là:

10 
10b 
23 
23A 
23B 
23D 
23E 
1111 
1164 
1174 

Một loại số không thực hiện công việc hoặc .

+0

Tại sao không phải là loại số thực hiện công việc? – lahsrah

+5

hãy xem tại http://www.codeproject.com/KB/string/NaturalSortComparer.aspx –

+0

@pratapchandra - chỉ cần đưa ra nhận xét của bạn một câu trả lời chính thức. – Jagd

Trả lời

4

Nếu bạn có LINQ, bạn có thể sử dụng OrderBy:

Regex digitPart = new Regex(@"^\d+", RegexOptions.Compiled); 
... 
myList.OrderBy(x => int.Parse(digitPart.Match(x).Value)) 
+3

Làm việc cho tôi, nhưng tôi đã phải thay đổi Integer.Parse để Int32.Parse, và .value nên được viết hoa. Cú pháp, meh ... – Jagd

+0

@ Jagd: Rất tiếc: P Tôi là người VB.NET và là 'Integer' ở đó. – Ryan

+0

Nó không rõ ràng từ câu hỏi liệu OP có muốn tìm kiếm tự nhiên hoàn toàn cũng sẽ đặt hàng "A1", "A2", "Bumblebee" theo thứ tự đó hay không. –

3
using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

public class NumStrCmp : IComparer<string> { 
    public int Compare(string x, string y){ 
     Regex regex = new Regex(@"(?<NumPart>\d+)(?<StrPart>\D*)",RegexOptions.Compiled); 
     var mx = regex.Match(x); 
     var my = regex.Match(y); 
     var ret = int.Parse(mx.Groups["NumPart"].Value).CompareTo(int.Parse(my.Groups["NumPart"].Value)); 
     if(ret != 0) return ret; 
     return mx.Groups["StrPart"].Value.CompareTo(my.Groups["StrPart"].Value); 
    } 
} 

class Sample { 
    static public void Main(){ 
     var data = new List<string>() {"10","10b","1111","1164","1174","23","23A","23B","23D","23E"}; 
     data.Sort(new NumStrCmp()); 
     foreach(var x in data){ 
      Console.WriteLine(x); 
     } 
    } 
} 
Các vấn đề liên quan