如果要进行普通字母排序,只需调用内置的sort函数:
treeView1.Sort();
而有时这还不够好,这时你需要编写一个自定义排序器。这很简单,它只需要为<
、==
或>
的结果提供一个返回-1
、0
或1
的int
即可。通常,在对数据进行一些处理后,内置的比较器就能胜任。
这是一个自定义排序器的示例。它是一个简单的类,实现了IComparer
接口,该接口只有一个方法。
在调用常规字符串Compare
方法之前,它会准备两个节点文本以供我的自定义比较。
这个准备过程会插入许多零来填充尾随数字,使其长度恒定。
虽然这只是一个示例,但它可以按数值/时间顺序排序例如设计师的默认名称。
public class NodeSorter : System.Collections.IComparer
{
public NodeSorter() { }
public int Compare(object x, object y)
{
TreeNode tx = x as TreeNode;
TreeNode ty = y as TreeNode;
string s1 = tx.Text;
while (s1.Length > 0 && Char.IsDigit(s1.Last())) s1 = s1.TrimEnd(s1.Last());
s1 = s1 + tx.Text.Substring(s1.Length).PadLeft(12, '0');
string s2 = tx.Text;
while (s2.Length > 0 && Char.IsDigit(s2.Last())) s2 = s2.TrimEnd(s2.Last());
s2 = s2 + ty.Text.Substring(s2.Length).PadLeft(12, '0');
return string.Compare(s1, s2);
}
}
你可以通过赋值并调用sort方法来调用它:
treeView1.TreeViewNodeSorter = new NodeSorter();
treeView1.Sort();
结果:
![enter image description here](https://istack.dev59.com/Ns3Pv.webp)
![enter image description here](https://istack.dev59.com/Pwg4o.webp)
![enter image description here](https://istack.dev59.com/GqvO7.webp)
这是一个稍微修改过的MSDN TreeNodeSorter 示例。除了更改后的逻辑外,注意以下几点:
- 该示例较旧,并且未正确限定
IComparer
接口。随着泛型的出现,我们通常会有一个using System.Collections.Generic;
子句,并且这将隐藏非泛型的IComparer
接口,导致编译器错误,抱怨缺少类型参数。
添加限定符可以解决这个问题..:
public class NodeSorter : System.Collections.IComparer