【问题标题】:OrderBy Signature Error in Pro LINQ book?Pro LINQ 书中的 OrderBy 签名错误?
【发布时间】:2009-03-29 21:53:49
【问题描述】:

根据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 documentationTKey 没有泛型约束,它应该是IComparable&lt;TKey&gt; 类型

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);

从上面的代码 sn-p 中,lambda 表达式只是返回要排序的库存属性。它看起来不像返回IComparer&lt;T&gt;的表达式

但根据逻辑,看起来 lambda 表达式应该是 IComparer&lt;T&gt; 类型。

OrderBy 的正确声明是哪一个?
(Apress.com Errata page 没有相关信息)

这是我为测试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; }
}

【问题讨论】:

    标签: c# .net linq errata


    【解决方案1】:

    将您的第二个“OrderBy”更改为“ThenBy”。您目前正在重新排序所有内容,因此它有效地按大小,然后按单位,但效率低下。我不确定您认为IComparer&lt;T&gt; 应该出现在哪里,除非您将其指定为另一个参数。基本上它使用Comparer&lt;T&gt;.Default,除非你指定一个单独的比较器。

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

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

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

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

    【讨论】:

    • 本书的下一部分处理“ThenBy”...顺便说一句,这是否意味着“OrderBy”的原型(在问题中提到)不正确,我会假设 MSDN 文档是最新的签名吗?
    • 是的,通常使用 MSDN - 他们通常至少会得到正确的签名。
    • 说我们疯了,但我只是使用智能感知/对象浏览器/显示定义 - 那就没什么可出错的了。虽然当然 MSDN 是从代码生成的(+Sandcastle?)
    • @Jon:哎呀,当我改变测试数据时,我能够看到“ThenBy”的使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2017-12-18
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多