First()会执行OrderBy()吗?

Mar*_*tin 10 linq linq-extensions

(渐近)性能之间是否存在差异?

var a = Orders.OrderBy(order => order.Date).First()
Run Code Online (Sandbox Code Playgroud)

var y = Orders.Where(order => order.Date == Orders.Min(x => x.Date)).ToList();
Run Code Online (Sandbox Code Playgroud)

即将First()执行OrderBy()?我猜不是.MSDN说通过foreach och GetEnumerator枚举集合,但是短语不排除其他扩展.

Eam*_*nne 11

一些东西:

  • OrderBy() 订单从小到大,所以你的两个选择返回不同的元素
  • Where() 通常是懒惰的,所以你的第二个表达式实际上根本不做任何计算 - 直到使用.
  • 原则上,有问题的行为取决于查询提供程序.例如,您可能确实希望sql-server linq查询提供程序以不同于IEnumerable查询提供程序的方式处理它.查询提供程序可能选择使"OrderBy"的返回值足够专门化,以便调用First()它可以识别(在编译或运行时)它在有序枚举上运行而不是排序,选择返回(首先)最小元素.
  • 特别是对于IEnumerable<T>提供者,OrderBy碰巧返回一个可以在每次检索第一个元素时完全缓冲和排序输入的枚举 - 因此,在常见的基本Linq到对象的情况下,OrderBy().First()可以比较OrderBy().ToArray().

记住linq只是一堆函数名 - 每个提供者可能会选择以不同的方式实现它们,所以上面只适用于System.Linq IEnumerable查询提供程序,而不一定适用于其他.


Kla*_*sen 6

First将返回传递给它的IEnumerable的第一个条目.由于传入的IEnumerable FirstOrderBy你的问题的结果可以改为" OrderBy工作",是的,它确实如此.

First不能推迟执行,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();
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 6

First方法将执行OrderBy(即,假设该First方法当然是执行的).当First方法从结果中提取第一项时OrderBy,它必须对所有项进行排序以找出哪一项是第一项.

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

还存在功能差异,如果存在重复日期,则第二个查询可以返回多个项目.