如何允许我将方法传递给List.Sort()
本文关键字:List Sort 允许我 方法 | 更新日期: 2023-09-27 18:19:55
我正在List
:上调用Sort
List<Stuff> list = new List<Stuff>();
list.Sort(StuffSortByName);
StuffSortByName
声明为:
private static int StuffSortByName(Stuff x, Stuff y)
{
...
}
让我惊讶的是,我的代码编译并且有效。令人惊讶的是,Sort
的过载不需要一种方法:
Sort()
Sort(Comparison<T>)
Sort(IComparer<T>)
Sort(Int32, Int32, IComparer<T>)
所以我很幸运,因为我不想创建一个完整的对象,实现IComparer,只是为了对东西进行排序。但就我的一生而言,我不明白它是如何编译的。
现在我想复制这种魔力。我想对ListView进行排序。但你不给列表排序,你通过列表视图的ListViewItemSorter
属性给它一个IComparer
:
listView1.ListViewItemSorter = [IComparer]
再说一遍,我不想写一个完整的对象,我只想传递一个本地方法(理想情况下是非静态方法):
listView1.ListViewItemSorter = SortListView;
private static int SortListView(Object x, Object y)
{
....
}
当然,这不会编译,因为它毫无意义。但是,早期的语法也不应该编译,但它确实编译了。
所以它给了我希望,我可以在这里有同样令人困惑的语法。
在第一种情况下,如何允许我将方法作为排序比较器传递,而在第二种情况下却不允许?
要回答您的第一个问题,之所以可以传递方法名称,是因为Comparison<T>
是一个委托类型,这意味着它是一个表示方法签名的类型。有关详细信息,请参阅MSDN。
在您的情况下,您应该创建一个IComparer
对象,或者让Stuff
对象实现IComparable
或IComparable<T>
(如果可能的话)。
我认为您只需要使用这个重载。使用比较
来自链接:
如果提供比较,则对List(of T)的元素进行排序使用代理表示的方法
编辑
ListView
呢,正如您所注意到的,它实现了IComparer
,而而不是Comparison
,所以您不能只向它传递委托。