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

first()将执行orderby()吗?

  •  8
  • Martin  · 技术社区  · 16 年前

    在(渐近)性能上

    var a = Orders.OrderBy(order => order.Date).First()
    

    var y = Orders.Where(order => order.Date == Orders.Min(x => x.Date)).ToList();
    

    也就是说,first()将执行orderby()吗?我猜不会。 MSDN 表示通过foreach och getEnumerator枚举集合可以,但该短语不排除其他扩展名。

    4 回复  |  直到 16 年前
        1
  •  7
  •   Eamon Nerbonne    16 年前

    有几件事:

    • OrderBy() 从小到大的顺序,所以您的两个备选方案返回不同的元素
    • Where() 通常是懒惰的,所以第二个表达式实际上根本不做任何计算—直到使用。
    • 原则上,所讨论的行为取决于查询提供程序。例如,您可能确实希望SQL Server LINQ查询提供程序处理此问题的方式与IEnumerable查询提供程序不同。查询提供程序可以选择使返回值“orderby”足够专门化,以便调用 First() 在它识别(无论是在编译时还是运行时)它运行在一个有序的可枚举项上,并且选择返回(第一个)最小元素而不是排序。
    • 专门为 IEnumerable<T> 供应商, OrderBy 每次检索第一个元素时,都会返回一个可枚举的值来对输入进行完全缓冲和排序,因此,在常见的基本linq to objects情况下, OrderBy().First() 相当于 OrderBy().ToArray() .

    请记住,LINQ只是一堆函数名—每个提供程序可能会选择以不同的方式实现这些函数名,因此以上仅适用于System.LinqIEnumerable查询提供程序,而不一定适用于其他提供程序。

        2
  •  6
  •   Klaus Byskov Pedersen    16 年前

    First 将返回传递给它的IEnumerable的第一个条目。自从IEnumerable传递给 弗斯特 OrderBy 你的问题可以改为 排序 工作“,是的。

    弗斯特 无法推迟执行 排序 因为它会立刻返回结果。例如:

            var numbers = new int[] { 9, 3, 4, 6, 7 };
    
            var num = numbers.First();
            Console.WriteLine(num);
    
            num = numbers.OrderBy(i => i).First();
            Console.WriteLine(num);
    
            Console.ReadLine();
    
        3
  •  6
  •   Guffa    16 年前

    这个 First 方法将执行 OrderBy (也就是说,鉴于 弗斯特 方法当然执行)。当 弗斯特 方法从 排序 ,则必须对所有项目进行排序,以确定哪个项目是第一个项目。

    根据查询运行的位置和方式(即,如果查询引擎无法优化查询),第二个查询可能会执行得相当糟糕。如果 Orders.Max 对中的每个项目评估一次 Orders ,它变成一个o(n*n)操作,这非常糟糕。

    还有一个函数差异,如果有重复的日期,第二个查询可以返回多个项。

        4
  •  0
  •   Henk Holterman    16 年前

    不是的。这就是说-自然,orderby会在有人试图实际获取第一个元素时执行。

    但正如你所说,条件可能会有进一步的定义。因此,不-它不会在那一刻执行。

    推荐文章