有没有办法将方法作为参数传递给函数,然后通过list.Sort()调用它?我试过这个:
public static string BuildHumanSitemap(Func<TreeNode, TreeNode, int> sortMethod, params string[] classNames)
{
//calling list sort on method passed as parameter
nodes.sort(sortMethod);
}
我希望传递的函数都使用相同的参数,例如
private static int SortByDateCreated(TreeNode x, TreeNode y)
{
DateTime xT = (DateTime)x["DocumentCreatedWhen"];
DateTime yT = (DateTime)y["DocumentCreatedWhen"];
return xT.CompareTo(yT);
}
我也尝试使用Action
委托类型,但是当我将它作为参数传递时,sort方法会抱怨。任何人都可以就如何做到这一点提出建议吗?
三江源
答案 0 :(得分:3)
创建新的比较委托并将其传递给Sort方法:
nodes.Sort(new Comparison<TreeNode>(sortMethod));
答案 1 :(得分:2)
也许您应该使用Func<,,>
代理,而不是接受Comparison<>
委托。因为这是List<>
想要的(出于历史原因; List<>.Sort
方法是为.NET 2.0编写的,在Func
代表介绍之前。)
因此:
public static string BuildHumanSitemap(Comparison<TreeNode> sortMethod, params string[] classNames)
{
//calling list sort on method passed as parameter
nodes.Sort(sortMethod);
}
然后非常简单地调用你的方法:
BuildHumanSitemap(SortByDateCreated);
其中SortByDateCreated
是您问题中的“方法组”。
首先不需要创建类型为Func<TreeNode, TreeNode, int>
的委托实例,然后创建引用第一个的委托实例(类型为Comparison<TreeNode>
)。
当然,您也可以使用lambda箭头作为第一个参数调用BuildHumanSitemap
方法。
答案 2 :(得分:0)
它的工作原理如下:
TreeView.TreeViewNodeSorter = new CustomNodeSorter();
private class CustomNodeSorter : IComparer
{
public int Compare(object x, object y)
{
DateTime xT = (DateTime)x["DocumentCreatedWhen"];
DateTime yT = (DateTime)y["DocumentCreatedWhen"];
return xT.CompareTo(yT);
}
}
答案 3 :(得分:0)
IComparer<T>
的解决方案。
<强>的Comparer 强>
public class MyTreeNodeComparer : IComparer<TreeNode>
{
public int Compare(TreeNode x, TreeNode y)
{
DateTime xT = (DateTime)x["DocumentCreatedWhen"];
DateTime yT = (DateTime)y["DocumentCreatedWhen"];
return xT.CompareTo(yT);
}
}
<强>用法强>
list.Sort(new MyTreeNodeComparer());