字符串比较以考虑数字

时间:2012-07-11 10:22:27

标签: c# winforms sorting treeview

我正在尝试根据文本属性对树视图的节点进行排序。问题是我的比较课并不关心数字。这是代码:

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);
    }
}

结果如下:

enter image description here

第一个子节点(Debug ...)没问题,但我的问题是为什么地球上“HBM \ D10”在“HBM \ D7”之前排序等等......

4 个答案:

答案 0 :(得分:5)

如果可移植性不是问题,您可以p / invoke StrCmpLogicalW()。 Windows shell使用此函数对其显示的文件名进行排序:

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);
    }
}

答案 1 :(得分:0)

阅读http://www.dotnetperls.com/alphanumeric-sorting。您可能需要删除其他所有内容以使其解决方案正常工作 - 因为它们按数字或字母顺序排序。

如果它是动态文件名,您可能最好使用正则表达式来匹配要排序的部分。

答案 2 :(得分:0)

这是因为char' 1'不如说#7; 7。这是因为字符串一次比较一个字符。

一个简单的解决方法是在字符串的开头加入填充0,如:

D04
D07
D10
D11

等...

答案 3 :(得分:0)

如果你有一个合理的模式来提取数字(我想像@“\ D \ d +”这样的东西)使用它来删除标签上的数字,然后如果标签是等于返回两个数字差异作为比较。