使用委托对列表进行排序时出现问题

本文关键字:排序 问题 列表 | 更新日期: 2023-09-27 17:48:52

我试图使用委托对列表进行排序,但遇到签名匹配错误。编译器说我无法从"匿名方法"转换

List<MyType> myList = GetMyList();
myList.Sort( delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); } );

我错过了什么?

以下是我找到的一些参考资料,它们也是这样做的。

开发者融合参考

Microsoft参考

使用委托对列表进行排序时出现问题

我想你想要:

myList.Sort( delegate (MyType t1, MyType t2) 
    { return (t1.ID.CompareTo(t2.ID)); } 
);

要进行排序,您需要的不是"真/假",您需要知道它是等于、大于还是小于。

Sort不接受二进制谓词,它接受返回int而不是boolComparison<T>委托。

当项目相等时,返回值为0,当第一个项目小于第二个项目时为<0,当第一项大于第二项时为>0

将来,如果你想调试这样的问题,我建议从Sort调用中去掉委托定义,如下所示:

Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... };
myList.Sort(c);

这样,您可以查看问题是在方法调用中,还是在委托定义中。有些人更喜欢这样(显然,使用比"c"更具描述性的名称),以使代码更具可读性。我可以接受它也可以离开它=-)

obj.Sort(delegate(…))的方式;是在一个地方进行动态排序。如果你有几个地方在做相同的排序,或者你需要更灵活的排序,你可以考虑创建一个实现IComparer<T>。这里有一个例子:

public class MyTypeComparer : IComparer<MyType>
{
  public MyTypeComparer() // default comparer on ID
  { ... }
  public MyTypeComparer(bool desc) // default with order specified
  public MyTypeComparer(string sort, bool desc) // specified sort and order such as property name, true or false.
  { ... }
  public int Compare(MyType a, MyType b) // implement IComparer interface
  { ... } // this is real sorting codes
}

下面是使用它的例子:

List<MyType> myList = GetList();
myList.Sort(new MyTypeComparer());
// myList.Sort(new MyTypeComparer(false));
// myList.Sort(new MyTypeComparer("FirstName", true));

确保您的ID属性是否为默认值数据类型,如Int或String。如果ID是对象引用类型,则该对象应实现IComparer或IComparer。

对不起之前的帖子。编辑器不接受<并且>字符,我没有注意到编辑器下面的预览。如果ID属性是对象类型,则该对象应实现IComparer或IComparer<T>。