2011-12-12 81 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; 
     } 

    } 
}