代码之家  ›  专栏  ›  技术社区  ›  wusher

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

  •  19
  • wusher  · 技术社区  · 17 年前

    我正在尝试使用代理对列表进行排序,但遇到签名匹配错误。编译器说我不能从“匿名方法”转换

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

    我错过了什么?

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

    Developer Fusion Reference

    Microsoft Reference

    6 回复  |  直到 17 年前
        1
  •  50
  •   cfeduke    17 年前

    我想你想要:

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

    要排序,您需要的不是“真/假”,您需要知道它是否等于、大于或小于。

        2
  •  10
  •   Jeff Yates    16 年前

    排序不采用二进制谓词,而是采用 Comparison<T> 返回 int 不是 bool .

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

        3
  •  3
  •   Coderer    17 年前

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

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

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

        4
  •  1
  •   David.Chu.ca    17 年前

    对象排序方式(委托(…);在一个地方进行动态排序。如果有几个地方进行了相同的排序,或者需要更灵活的排序,则可以考虑创建一个实现ICMPARER和LT的类;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));
    
        5
  •  0
  •   David.Chu.ca    17 年前

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

        6
  •  0
  •   David.Chu.ca    17 年前