2011-12-12 103 views
0

我有一個列表視圖中的幾列,但我只是這樣dummb想出一個邏輯排序方法來按字母和數字排序項目。由於數值的情況下 我想一列的內容,如:列表視圖項目排序

 
111  
13 
442 
23 
214 

是:

 
13 
23 
111 
214 
442 

我當前排序類看起來是這樣的:

class itemsorter:IComparer 
{ 
    public int compare (object a, object b) 
    { 
     return string.compare(((lvitem)a).text,((lvitem)b).text)); 
    } 
} 

回答

1

解析您的字符串在進行比較之前進行編號,在這種情況下,您可以簡單地從compare方法中返回2個數字的差異作爲結果。

由於聽起來你仍然想要對字母和數字值進行排序,所以這必須是一個與上述相結合的混合方法 - 這樣數字就按數字排序,按字母順序排列字母值。你只需要選擇哪個優先,這樣數字或字母值永遠都是第一位的 - 這對保持穩定和反身性是必要的。 (例如,如果a是一個數字,並且b是非數字,則返回1.如果a是非數字,並且b是數字,則返回-1。否則,它們必須是相同的類型,然後你可以按照類型進行排序。)

+0

謝謝你,我已經是字符串格式化 –

+0

按照上面我介紹其他columns'contents,這些都需要字母數字進行處理。然而,你可以進一步擴展這個例子來說明「字母數字以數字開頭」的情況,並且如果「a」和「b」值都屬於該類別,則可以拆分兩個部分(數字+字母),然後進行排序兩部分都是成對的。 – ziesemer

0

正如ziesemer所說,你可以拿我的示例代碼如下,希望這會給你一個手。

class itemsorter : IComparer 
{ 
    public int compare(object a, object b) 
    { 
     int resultA, resultB; 
     bool markA = int.TryParse(((lvitem)a).text, out resultA); 
     bool markB = int.TryParse(((lvitem)b).text, out resultB) 

     // They are number. 
     if (markA && markB) 
     { 
      if (resultA > resultB) 
       return 1; 
      else if (resultA < resultB) 
       return -1; 
      else 
       return 0; 
     } 


     // a can convert to number, 
     // b can't. 
     if (markA && !markB) 
     { 
      return 1; 
     } 

     // b can convert to number, 
     // a can't. 

     if(!markA && markB) 
     { 
      return -1; 
     } 

    } 
}