我如何允许将方法传递给List.Sort()?

时间:2012-01-09 22:13:49

标签: c# sorting comparison

我在Sort上致电List

List<Stuff> list = new List<Stuff>();
list.Sort(StuffSortByName);

使用StuffSortByName声明:

private static int StuffSortByName(Stuff x, Stuff y)
{
    ...
}

令我惊讶的是,我的代码编译 有效。令人惊讶的是Sort没有重载采用方法:

所以我很幸运,因为我不想创建一个实现IComparer的整个对象,只是为了排序。但是对于我的生活,我在编译时却不理解。


现在我想复制那个魔法。我想对ListView进行排序。但是你没有对listivew进行排序,你通过它的ListViewItemSorter属性给列表视图IComparer

listView1.ListViewItemSorter = [IComparer]

而且,再次,我不想写一个完整的对象,我只想传递一个本地方法(理想情况下是一个非静态方法):

listView1.ListViewItemSorter = SortListView;


private static int SortListView(Object x, Object y)
{
    ....
}

现在当然这不会编译,因为它没有意义。但是之前的语法也不应该编译 - 但确实如此。

所以它让我希望我在这里可以有同样令人困惑的语法。

在第一种情况下如何允许将方法作为排序比较器传递,但在第二种情况下不允许?

2 个答案:

答案 0 :(得分:4)

要回答您的第一个问题,可以传递方法名称的原因是因为Comparison<T>是委托类型,这意味着它是表示方法签名的类型。有关详细信息,请参阅MSDN

在您的情况下,您应该创建IComparer对象,或者让Stuff对象实现IComparableIComparable<T>(如果可能)。

答案 1 :(得分:0)

我认为你只需使用this overload。它使用Comparison

来自链接:

  

如果提供了比较,则对List(Of T)的元素进行排序   使用委托代表的方法

编辑

如您所注意到的ListView如何,它会实现IComparer Comparison,因此您不能只是将代理传递给它。< / p>