【问题标题】:How do I use a Lambda expression to sort INTEGERS inside a object?如何使用 Lambda 表达式对对象内的 INTEGERS 进行排序?
【发布时间】:2010-05-04 15:31:55
【问题描述】:

我有一个对象的集合,我知道我可以通过说来按名称(字符串类型)排序

collEquipment.Sort((x, y) => string.Compare(x.ItemName, y.ItemName));

这很有效。

但我想按 ID(整数类型)排序,没有 Int32.Compare 之类的东西

那么我该怎么做呢?这不起作用

collEquipment.Sort((x, y) => (x.ID < y.ID));  //error

我知道答案会非常简单。 Lambda 表达式让我感到困惑。

【问题讨论】:

    标签: c# collections lambda


    【解决方案1】:
    collEquipment.Sort((x, y) => y.ID.CompareTo(x.ID));
    

    【讨论】:

    • why 的简短解释是,Sort 不采用小于运算符 - 它采用“比较器”运算符,如果 xy,则 >0,如果 x==y,则为 0。所以它总是期望一个整数结果,而不是一个布尔值。 int 上的 CompareTo() 方法在此模式中返回 0,因此您可以使用它简洁地解决您的问题,尽管使用 if-else 也可以(如果 (x.IDy.ID) 返回 1;否则返回 0;)。
    【解决方案2】:

    在这里,根据任何实现 IComparable[&lt;T&gt;]int 实现)的属性对列表进行排序:

    public static class ListExtensions {
        public static void Sort<TSource, TValue>(
            this List<TSource> list,
            Func<TSource, TValue> selector) {
            list.Sort((x,y) => Comparer<TValue>.Default
                .Compare(selector(x),selector(y)));
        }
    }
    

    现在:

    collEquipment.Sort(x => x.ItemName);
    

    collEquipment.Sort(x => x.ID);
    

    【讨论】:

      【解决方案3】:

      试试这个

      collEquipment.Sort((x, y) => y.ID - x.ID);
      

      【讨论】:

      • 可能有一些非常大的数字的环绕问题
      • 很棒的作品,谢谢!它只是数据库中项目的 ID .. 所以不会太大
      • 您不应该使用- 来实现 CompareTo - 它不起作用(溢出问题等)
      • @punkouter:他正在使用减法来实现 CompareTo,这是有缺陷的。见this post
      • @punkouter:排序函数需要返回 0、>0 或
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多