我正在尝试使用委托对列表进行排序,但出现签名匹配错误。编译器说我无法从“匿名方法”转换
List<MyType> myList = GetMyList();
myList.Sort( delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); } );
我错过了什么?
以下是我找到的一些参考资料,他们也是这样做的。
我想你想要:
myList.Sort( delegate (MyType t1, MyType t2)
{ return (t1.ID.CompareTo(t2.ID)); }
);
要进行排序,您需要“真/假”以外的其他内容,您需要知道它是等于、大于还是小于。
Sort 不采用二元谓词,它采用返回not a的Comparison<T>
委托。int
bool
返回值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>。