0

根据Pro LINQ: Language Integrated Query in C# 2008OrderBy运算符的原型是

public static IOrderedEnumerable<T> OrderBy<T, K>(
    this IEnumerable<T> source,
    Func<T, K> keySelector)
where
    K : IComparable<K>

但是MSDN 文档对TKey没有泛型约束,它应该是类型IComparable<TKey>

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

我基本上是按Unit然后按Size对 Inventory 进行排序。

    var sortedInventories = inventories
                            .OrderBy(inventory => inventory.Unit)
                            .OrderBy(inventory => inventory.Size);

从上面的代码片段中,lambda 表达式只是返回要排序的库存属性。它看起来不像返回的表达式IComparer<T>

但根据逻辑,看起来 lambda 表达式应该是 type IComparer<T>

哪个是正确的声明OrderBy
(Apress.com Errata 页面上没有任何信息)

这是我为测试而创建的示例应用程序OrderBy

public class Program
{
    public static void Main(string[] args)
    {
        var inventories = new[] {
            new Inventory { Unit = 1, Size = 2 },
            new Inventory { Unit = 2, Size = 4 },
            new Inventory { Unit = 3, Size = 6 },
        };
        var sortedInventories = inventories
                                .OrderBy(inventory => inventory.Unit)
                                .OrderBy(inventory => inventory.Size);

        foreach (var inventory in sortedInventories)
            Console.WriteLine("Unit: {0}; Size = {1}", inventory.Unit, inventory.Size);
    }
}

public class Inventory
{
    public int Unit { get; set; }
    public double Size { get; set; }
}
4

1 回答 1

4

将您的第二个“OrderBy”更改为“ThenBy”。您目前正在使用所有东西,因此它有效地按大小,然后按单位,但效率低下。我不确定您认为IComparer<T>应该从哪里进入,除非您将其指定为另一个参数。基本上它使用Comparer<T>.Default,除非您指定一个单独的比较器。

无论如何,您的查询应该是:

var sortedInventories = inventories
                          .OrderBy(inventory => inventory.Unit)
                          .ThenBy(inventory => inventory.Size);

(根据您的测试数据,您无法区分,因为在每种情况下Size = Unit * 2。尝试使用一个具有小单元和大尺寸的项目。)

是的,看起来这本书的签名有点错误——可能是因为它在发布前不久发生了变化。如果您基本上担心得到错误的结果,以上就是解释。

于 2009-03-29T21:58:02.793 回答