2012-07-11 7 views
5

Tôi đang cố gắng sắp xếp các nút của một số lần xem trước đối với thuộc tính văn bản của chúng. Vấn đề là lớp so sánh của tôi không quan tâm đến các con số. Đây là mã:So sánh chuỗi để xem xét các số

public class TreeNodeSorter : IComparer 
{ 
    public int Compare(object x, object y) 
    { 
     var tx = x as TreeNode; 
     var ty = y as TreeNode; 

     return string.Compare(tx.Text, ty.Text); 
    } 
} 

Và đây là kết quả:

enter image description here

Nút đứa con đầu lòng (Debug ...) là ok, nhưng vấn đề của tôi là tại sao trên trái đất "HBM \ D10 "được sắp xếp trước" HBM \ D7 "và cứ thế ...

+1

bản sao có thể có của [Thứ tự sắp xếp tự nhiên trong C#] (http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp) – Jon

Trả lời

0

Đọc một số http://www.dotnetperls.com/alphanumeric-sorting. Bạn có thể cần phải loại bỏ tất cả mọi thứ khác mặc dù để có được giải pháp của họ để làm việc - khi họ sắp xếp một trong hai số hoặc theo thứ tự abc.

Nếu đó là tên tệp động, bạn có thể sử dụng regex tốt nhất để khớp với các phần bạn muốn sắp xếp theo.

5

Nếu tính di động không phải là vấn đề, bạn có thể p/gọi StrCmpLogicalW(). Chức năng này được vỏ Windows sử dụng để sắp xếp tên tệp hiển thị:

public class TreeNodeSorter : IComparer 
{ 
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] 
    static extern int StrCmpLogicalW(string x, string y); 

    public int Compare(object x, object y) 
    { 
     var tx = x as TreeNode; 
     var ty = y as TreeNode; 

     return StrCmpLogicalW(tx.Text, ty.Text); 
    } 
} 
+0

Phụ thuộc vào cách 'sạch' của giải pháp bạn muốn thực sự . Tỷ lệ cược là, nếu bạn thực hiện của riêng bạn bằng cách sử dụng phương pháp tại DotNetPearls và regex, bạn có thể sẽ tìm hiểu thêm và có thể tái sử dụng nó. – Echilon

0

Điều này là do char '1' nhỏ hơn char '7. Điều này là do các chuỗi được so sánh một char tại một thời điểm.

Một sửa chữa dễ dàng sẽ được incude đệm của 0 tại begininning của chuỗi, như:

D04 
D07 
D10 
D11 

vv ...

0

Nếu bạn có một mô hình hợp lý để trích xuất các số (tôi đoán một cái gì đó như @ "\ D \ d +") sử dụng điều này để loại bỏ số từ nhãn của bạn, sau đó nếu nhãn bằng bằng trả lại sự khác biệt số hai như so sánh.