我正在尝试根据文本属性对树视图的节点进行排序。问题是我的比较课并不关心数字。这是代码:
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”之前排序等等......
答案 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 +”这样的东西)使用它来删除标签上的数字,然后如果标签是等于返回两个数字差异作为比较。