如何允许我将方法传递给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)
{
    ....
}

当然,这不会编译,因为它毫无意义。但是,早期的语法也不应该编译,但它确实编译了。

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

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

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

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

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

我认为您只需要使用这个重载。使用比较

来自链接:

如果提供比较,则对List(of T)的元素进行排序使用代理表示的方法

编辑

ListView呢,正如您所注意到的,它实现了IComparer,而而不是Comparison,所以您不能只向它传递委托。