7

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

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

结果如下:

在此处输入图像描述

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

4

4 回答 4

7

如果可移植性不是问题,您可以 p/调用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);
    }
}
于 2012-07-11T10:28:25.153 回答
1

阅读http://www.dotnetperls.com/alphanumeric-sorting。您可能需要去掉其他所有内容才能使他们的解决方案发挥作用——因为它们是按数字或字母顺序排序的。

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

于 2012-07-11T10:29:00.090 回答
0

这是因为 char '1' 小于 char '7。这是因为字符串一次比较一个字符。

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

D04
D07
D10
D11

ETC...

于 2012-07-11T10:29:31.720 回答
0

如果您有一个合理的模式来提取数字(我猜类似 @"\D\d+" )使用它从标签中删除数字,那么如果标签相等,则返回两个数字差作为比较。

于 2012-07-11T10:32:23.667 回答