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

专业LINQ手册中的orderby签名错误?

  •  0
  • dance2die  · 技术社区  · 16 年前

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

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

    但是 MSDN documentation 在上没有泛型约束 TKEY 应该是那种 IComparable<TKey>

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

    我基本上是按 单位 然后通过 尺寸 .

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

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

    但是根据逻辑,lambda表达式的类型应该是 i比较程序<t> .

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

    这是我创建用来测试的示例应用程序 排序

    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; }
    }
    
    1 回复  |  直到 11 年前
        1
  •  4
  •   Jon Skeet    16 年前

    将第二个“orderby”更改为“thenby”。你现在是 诉诸 每件事,所以它是有效的规模,然后单位,但效率低下。我不知道你在想什么 IComparer<T> 除非您将其指定为另一个参数,否则应该传入。基本上它使用 Comparer<T>.Default 除非指定单独的比较器。

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

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

    (对于你的测试数据,你不能分辨出不同之处,因为在每种情况下 Size = Unit * 2 . 试着用一个小单元大尺寸的物品。)

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