gpt4 book ai didi

c# - 后续 from 子句与查询延续

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:15 24 4
gpt4 key购买 nike

使用 subsequent from 子句query continuation 有什么区别?

后面的 from 子句是指使用 ...from...in...from...in...select 模式构建查询。

关于查询延续和intothis MSDN article说:

It is often useful to treat the results of one query as a generator in a subsequent query.

因此,into 关键字可以帮助我们将查询链接在一起,可以这么说。不过,我们似乎不需要 into 关键字。相反,我们可以只使用后续的 from 子句。但是,文章阐述了:

...use the into keyword to splice a new query expression after a select or group clause.

因此,into 允许在拼接新查询之前使用selectgroup。这是使用查询延续而不是更简单的后续 from 子句的唯一原因吗?

例如,以下两个查询做同样的事情。

https://dotnetfiddle.net/pwKcQU

using System;
using System.Collections;
using System.Linq;

public static class Program
{
public static void Main()
{
var array = new [] { "ab", "cd" };

var subsquentFromClause =
from first in array
from second in first
select second;

subsquentFromClause.Dump("Subsequent");

var queryContinuation =
from first in array select first into x
from second in x select second;

queryContinuation.Dump("Continuation");

}

public static void Dump(this IEnumerable query, string title)
{
Console.WriteLine("\n" + title);
foreach(var r in query)
{
Console.WriteLine(r);
}
}
}

最佳答案

找出实际情况的最佳方法是使用像 ILSpy 这样的工具来反汇编代码并查看它。

查询表达式基本上是语法糖。它们是为了您的方便而存在的,然后被转换为实际的函数调用。编译器机械地将它们翻译成一系列对 IEnumerable<T> 的调用。扩展方法。例如,两个 from条款被翻译成SelectMany具有该表达式所需参数的扩展方法。

在这个特定的查询延续案例中:

  • SelectMany 之前你需要做一个额外的投影, 和
  • 你的 SelectMany可以访问投影 x , 但是
  • 变量first将不再在范围内。

生成的实际扩展方法链调用有点难以手动完成。最简单的方法是在 ILSpy 中查看它。

我什至认为在转换过程中没有进行任何优化,因为它完全是机械的。如果转换更智能,它可以优化您示例中的投影。

看看here查看 ILSpy 反编译的一些实例。

例如,这是您查询的 IL:

//Subsequent
System.String[]
.SelectMany (
first => first,
(first, second) => second
)

//Continuation
System.String[]
.Select (first => first)
.SelectMany (
x => x,
(x, second) => second
)

关于c# - 后续 from 子句与查询延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29609147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com