0

有没有办法将方法作为参数传递给函数,然后通过 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委托类型,但是当我将它作为参数传递时,排序方法会报错。任何人都可以就如何做到这一点提出建议吗?

谢谢

4

4 回答 4

3

创建新的比较委托并将其传递给 Sort 方法:

nodes.Sort(new Comparison<TreeNode>(sortMethod));
于 2012-12-21T16:33:34.543 回答
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>引用第一个委托实例(类型)。

当然,您也可以BuildHumanSitemap使用 lambda 箭头作为第一个参数来调用您的方法。

于 2012-12-21T18:44:56.367 回答
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);
     }
  }
于 2012-12-21T16:31:37.047 回答
0

解决方案IComparer<T>

比较器

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());
于 2012-12-21T16:32:33.293 回答