Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq First()将执行OrderBy()吗?_Linq_Linq Extensions - Fatal编程技术网

Linq First()将执行OrderBy()吗?

Linq First()将执行OrderBy()吗?,linq,linq-extensions,Linq,Linq Extensions,这两种方法的(渐近)性能有什么不同吗 var a = Orders.OrderBy(order => order.Date).First() 及 i、 e.将首先()执行OrderBy()?我猜不会。说通过foreach-och-GetEnumerator枚举集合,但措辞不排除其他扩展。它不排除。话虽如此,orderby自然会在有人试图实际获取第一个元素时执行 但正如你所说,这些条件可能会得到进一步的定义。因此,否-此时不执行。First将返回传递给它的IEnumerable的第一个条目

这两种方法的(渐近)性能有什么不同吗

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


i、 e.将首先()执行OrderBy()?我猜不会。说通过foreach-och-GetEnumerator枚举集合,但措辞不排除其他扩展。

它不排除。话虽如此,orderby自然会在有人试图实际获取第一个元素时执行


但正如你所说,这些条件可能会得到进一步的定义。因此,否-此时不执行。

First
将返回传递给它的IEnumerable的第一个条目。由于传递给
First
的IEnumerable是
OrderBy
的结果,因此您的问题可以重新表述为“Does
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();

First
方法将执行
OrderBy
(也就是说,假定执行了
First
方法)。当
First
方法从
OrderBy
的结果中提取第一项时,它必须对所有项进行排序,以确定哪一项是第一项

根据查询运行的位置和方式(即,如果查询引擎无法对其进行优化),第二个查询可能会执行得非常糟糕。如果对
Orders
中的每个项目计算一次
Orders.Max
,它将成为一个O(n*n)操作,这是非常糟糕的

还有一个功能上的差异,如果存在重复的日期,第二个查询可以返回多个项目。

有几点:

  • OrderBy()
  • Where()
    通常是惰性的,因此您的第二个表达式实际上根本不进行任何计算—直到被使用为止
  • 原则上,所讨论的行为取决于查询提供程序。例如,您可能确实希望sql server linq查询提供程序与IEnumerable查询提供程序处理此问题的方式不同。查询提供程序可能会选择将“OrderBy”的返回值充分专门化,以便对其调用
    First()
    (在编译时或运行时)可以识别它正在有序枚举表上运行,而不是排序,选择返回(第一个)最小元素
  • 特别是对于
    IEnumerable
    提供程序,
    OrderBy
    在每次检索第一个元素时都会返回一个可枚举项,该可枚举项会对输入进行完全缓冲和排序,因此,在常见的基本Linq to objects情况下,
    OrderBy().first()
    OrderBy().ToArray()相当

请记住,linq只是一组函数名-每个提供程序可能会选择不同的实现方式,因此上述内容仅适用于系统。linq IEnumerable查询提供程序,不一定适用于其他提供程序。

虽然您在技术上是正确的,但我觉得您给OP留下了错误的印象。但首先()实际上是获取第一个元素,所以我非常确定第一行确实会执行orderBy。如果为true,则没有区别。第二个查询中的While也不会执行,直到有人真正得到结果。为清晰起见,添加了赋值。它现在就可以执行了,不是吗?@马丁:第一个会执行,但第二个不会。第一个将获取第一项并分配给变量,但第二个将创建一个可以返回结果的表达式。在从表达式中读取结果之前,该表达式不会执行,例如:
List earlyOnes=y.ToList()。我明白了。我认为linq2sql可能会优化第一条语句的sql。如果不是,sql server可能会优化解释。如果没有,我很快就会知道。是吗?事实上,尝试是一个很好的方法,可以很快找到答案:-)-但当然,这听起来对我来说是对的。顺便说一句,正如Guffa所说,这两个值是不一样的-第二个选项可以返回多个值,第一个选项不能。对于.NET 4.7.1,上述情况不再适用。OrderBy返回OrderedEnumerator,但它在返回时并没有对列表进行实际排序。当您调用First()时,它只需查看对象,并找出第一个项目,而这就是它现在所做的,而不必对列表进行实际排序。如果列表已排序,则它似乎也是O(n)。看见
        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();