将方法作为参数传递给函数

时间:2012-12-21 16:27:07

标签: c# sorting delegates func

有没有办法将方法作为参数传递给函数,然后通过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方法会抱怨。任何人都可以就如何做到这一点提出建议吗?

三江源

4 个答案:

答案 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());