字符串比较中如何考虑数字

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

这是英文文本,翻译成中文如下:

以下是结果:

输入图像描述

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


1
可能是Natural Sort Order in C#的重复问题。 - Jon
4个回答

8
如果可移植性不是问题,您可以使用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);
    }
}

取决于你想要多么“干净”的解决方案。如果你使用DotNetPearls上的方法和正则表达式来实现自己的解决方案,你可能会学到更多,并且有可能重复使用它。 - Echilon
我刚发现如果参数都是空的,StrCmpLogicalW 函数会挂起,因此检查 null 值可能很有用。 - oleksa

1

请阅读http://www.dotnetperls.com/alphanumeric-sorting。您可能需要剥离其他内容,以使其解决方案起作用-因为它们按数字或字母顺序排序。

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


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

0

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

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

D04
D07
D10
D11

等等...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接