使用委托对列表进行排序时出现问题
本文关键字:排序 问题 列表 | 更新日期: 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
而不是bool
的Comparison<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>。