20

我正在尝试使用委托对列表进行排序,但出现签名匹配错误。编译器说我无法从“匿名方法”转换

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

我错过了什么?

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

开发者融合参考

微软参考

4

6 回答 6

50

我想你想要:

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

要进行排序,您需要“真/假”以外的其他内容,您需要知道它是等于、大于还是小于。

于 2008-10-23T17:23:10.570 回答
10

Sort 不采用二元谓词,它采用返回not a的Comparison<T>委托。intbool

返回值0用于当项目相等时,<0当第一项小于第二项时,以及>0当第一项大于第二项时。

于 2008-10-23T17:20:11.577 回答
3

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

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

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

于 2008-10-23T18:18:00.570 回答
1

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));
于 2008-10-23T19:49:26.813 回答
0

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

于 2008-10-23T18:04:07.697 回答
0

抱歉之前的帖子。编辑器不带 < 和 > 字符,我没有注意到编辑器正下方的预览。如果 ID 属性是对象类型,则该对象应实现 IComparer 或 IComparer<T>。

于 2008-10-23T18:08:52.133 回答