C#-如何对包含文本和数字的字符串进行排序

时间:2018-11-10 15:46:57

标签: c# sorting compare string-comparison compareto

我有一个列表视图,其中充满了计算机名和用户名以及一个数字(作为字符串)。我已经使用IComparer接口创建了自己的ListViewItemComparer。但是它不能像我想要的那样正确地对项目进行排序。 例如,这就是它应该如何对计算机进行排序: 电脑1 电脑2 电脑3 ... 电脑15

,这是它们的排序方式: 电脑1 电脑10 计算机11 ... 电脑2 电脑3

问题是我不能简单地剪掉“计算机”部分,然后比较下面的数字,因为这只是一个例子,计算机名可以是所有内容(aaa393bbb333,ccccvvvv,222hhhdh,Computer-01,计算机-02,....)

这是我的代码:

 private bool isNumeric(String pInput)
    {
        int o;
        return int.TryParse(pInput, out o);
    }

    public int Compare(object x, object y)
    {
        ListViewItem itemX = x as ListViewItem;
        ListViewItem itemY = y as ListViewItem;
        //
        int returnVal = -1;
        if (itemX == null && itemY == null) returnVal = 0;
        else if (itemX == null) returnVal = -1;
        else if (itemY == null) returnVal = 1;
        else if (itemX.SubItems.Count - 1 < col && itemY.SubItems.Count - 1 < col) returnVal = 0;
        else if (itemX.SubItems.Count - 1 < col) returnVal = -1;
        else if (itemY.SubItems.Count - 1 < col) returnVal = 1;
        else if(isNumeric(itemX.SubItems[col].Text) && isNumeric(itemY.SubItems[col].Text))
        {
            //used for number comparison
            int value1 = int.Parse(itemX.SubItems[col].Text);
            int value2 = int.Parse(itemY.SubItems[col].Text);
            if (value1 == value2) returnVal = 0;
            else if (value1 < value2) returnVal = -1;
            else if (value1 > value2) returnVal = 1;
        }
        else returnVal = String.Compare(itemX.SubItems[col].Text, itemY.SubItems[col].Text);
        if (order == SortOrder.Descending)
            returnVal *= -1;
        return returnVal;
    }

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式

(?<=\D)(?=\d)|(?<=\d)(?=\D)

将字符串拆分为数字和文本。

string[] parts = Regex.Split(theString, @"(?<=\D)(?=\d)|(?<=\d)(?=\D)");

这将交替产生数字和文本。运作方式:

(?<=exp)pos      Match any position pos following a prefix exp. 
pos(?=exp)       Match any position pos preceding a suffix exp. 

因此,正则表达式表示在文本和数字之间的位置处或数字和文本之间的位置处进行分隔,其中\D代表非数字字符,\d代表数字字符,{{ 1}}代表OR。

您将必须使用以下命令测试第一部分是文本还是数字

|

如果第一部分是数字,则偶数索引的所有部分都是数字,奇数索引的所有部分都是文本,反之亦然。

bool firstIsNumber = Char.IsDigit(parts[0][0]);