我会尽力让您理解它,并且让我知道我要去哪里了。
为了简单起见,假设我们生活在一个只有
1
,2
,3
,4
,5
%
,>
以他们惯常的优势我想解释我做的时候会发生什么
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类,我看到它如何创建我显示的示例树,但是我看不到它在查询中的作用。
我会尽力让您理解它,并且让我知道我要去哪里了。
好的。
我首先了解的是查询本身不会创建一个
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] 删除。
我来说两句