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)
{
....
}
现在当然这不会编译,因为它没有意义。但是之前的语法也不应该编译 - 但确实如此。
所以它让我希望我在这里可以有同样令人困惑的语法。
在第一种情况下如何允许将方法作为排序比较器传递,但在第二种情况下不允许?
答案 0 :(得分:4)
要回答您的第一个问题,可以传递方法名称的原因是因为Comparison<T>
是委托类型,这意味着它是表示方法签名的类型。有关详细信息,请参阅MSDN。
在您的情况下,您应该创建IComparer
对象,或者让Stuff
对象实现IComparable
或IComparable<T>
(如果可能)。
答案 1 :(得分:0)
我认为你只需使用this overload。它使用Comparison
来自链接:
如果提供了比较,则对List(Of T)的元素进行排序 使用委托代表的方法
编辑
如您所注意到的ListView
如何,它会实现IComparer
和不 Comparison
,因此您不能只是将代理传递给它。< / p>