我需要了解LINQ的帮助。我的理解哪里出错了?

用户名

我会尽力让您理解它,并且让我知道我要去哪里了。

为了简单起见,假设我们生活在一个只有

  • 数字12345
  • 操作员%>以他们惯常的优势

我想解释我做的时候会发生什么

List<int> All = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<int> Filtered = from i in All
                            where i % 2 == 1
                            orderby i descending
                            select i; 
foreach ( var i in Filtererd ) 
{
   Console.WriteLine(i);
}

我首先了解的是查询本身不会创建一个Ienumerable<int>;。它创建与查询关联的表达式树查询返回的元素yield在由编译器创建的不可见函数编辑,例如

public static IEnumerable<int> MyInvisibleFunction ( List<int> Source )
{
    foreach ( int i in Source.Reverse() )
    {
       if ( i % 2 == 1 ) 
       {
           yield return i;
       } 
    }
} 

(当然,这是一个奇怪的例子,因为Source.Reverse()它本身就是一个查询,但是无论如何……)

现在我很困惑表达发辫在这里发挥作用的地方。当我想到表达树时,我想到了像

        (3 % 1 > 0)
          /      \ 
         /        \   
     (3 % 1)  >    0
      /   \ 
     3  %  1

在我创造的小世界中。但是在我的LINQ查询中,像这样的树在哪里起作用?

from i in All
where i % 2 == 1
orderby i descending
select i

??? 那是我不明白的。我正在查看Expression类,我看到它如何创建我显示的示例树,但是我看不到它在查询中的作用。

埃里克·利珀特(Eric Lippert)

我会尽力让您理解它,并且让我知道我要去哪里了。

好的。

我首先了解的是查询本身不会创建一个Ienumerable<int>;。

这个说法是完全错误的。

它创建与查询关联的表达式树。

这句话也是完全错误的。

查询返回的元素在由编译器创建的不可见函数中产生

这句话也是完全错误的。

像这样的树在哪里进入我的LINQ查询

没有。您的查询不使用任何表达式树。

我正在查看Expression类,我看到它如何创建我显示的示例树,但是我看不到它将在哪里发挥作用

没有。

想解释我做什么

List<int> All = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<int> Filtered = from i in All
                        where i % 2 == 1
                        orderby i descending
                        select i; 
foreach ( var i in Filtererd ) 
  Console.WriteLine(i);

让我们分解一下。首先,编译器将其转换为

List<int> All = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<int> Filtered = All.Where(i => i % 2 == 1).OrderBy(i => i);                          
foreach ( var i in Filtererd ) 
  Console.WriteLine(i);

接下来,编译器执行重载解析并评估扩展方法

List<int> All = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<int> Filtered = 
  Enumerable.OrderBy<int>(
    Enumerable.Where<int>(All, i => i % 2 == 1)), 
    i => i));                           
foreach ( var i in Filtererd ) 
  Console.WriteLine(i);

接下来的lambda被删除了:

static bool A1(int i) { return i % 2 == 1; )
static int A2(int i) { return i }
...
List<int> All = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<int> Filtered = 
  Enumerable.OrderBy<int>(
    Enumerable.Where<int>(All, new Func<int, bool>(A1))), 
    new Func<int, int>(A2)));                           
foreach (var i in Filtererd ) 
  Console.WriteLine(i);

实际上,这并不是lambda精确去除的方式。它们也会被缓存,但是让我们忽略这个细节。

我假设您不希望将foreach废止。有关详细信息,请参见C#规范。

如果您想知道Where和OrderBy的功能,请阅读源代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我需要了解RxJx订阅语法的帮助

来自分类Dev

我需要了解javascript ||的帮助。它是否是逻辑“或”

来自分类Dev

我哪里出错了?

来自分类Dev

我哪里出错了 - JAVASCRIPT

来自分类Dev

我需要了解这个C代码

来自分类Dev

jQuery效果:我哪里出错了?

来自分类Dev

C#我哪里出错了

来自分类Dev

我无法消除矩阵,哪里出错了?

来自分类Dev

计算阶乘,我哪里出错了?

来自分类Dev

我的 HTTP 请求哪里出错了?

来自分类Dev

简单的javascript添加,我哪里出错了?

来自分类Dev

Scala表达,我需要了解其组成部分

来自分类Dev

我需要了解 odoo 中 xpath 的使用

来自分类Dev

需要了解我用于图表的这段代码

来自分类Dev

我需要帮助-python,我不了解,使用findall函数,未给出错误

来自分类Dev

我想知道我的代码哪里出错了

来自分类Dev

需要我编写的代码的帮助(需要理解)

来自分类Dev

我需要帮助来了解编程挑战

来自分类Dev

我需要帮助来了解cv :: mixChannels

来自分类Dev

我的推理哪里错了?

来自分类Dev

我哪里错了?

来自分类Dev

JS验证登录表单-我哪里出错了?

来自分类Dev

用C编写队列,我的代码哪里出错了

来自分类Dev

我在设置 bxSlider 幻灯片时哪里出错了?

来自分类Dev

我在课堂上使用 promise 哪里出错了?

来自分类Dev

谁能看到我这个 srcset 哪里出错了?

来自分类Dev

我需要帮助理解括号的使用

来自分类Dev

我需要帮助理解这个“for”循环

来自分类Dev

嗨,我对此有疑问,请告诉我我哪里出错了