- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用 subsequent from 子句和query continuation 有什么区别?
后面的 from 子句是指使用 ...from...in...from...in...select
模式构建查询。
关于查询延续和into
,this 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
允许在拼接新查询之前使用select
或group
。这是使用查询延续而不是更简单的后续 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/
函数式编程中有一个 CPS 技巧,它采用非尾递归函数并以连续传递样式 (CPS) 重写它,从而轻松地使其成为尾递归。很多问题实际上都涵盖了这一点,例如 https://lorgonblog.wordp
这篇文章是这个 post 的延续 我有 DlUser 类,这个类的每个对象都可能有 DLFaceBook 类,DlFaceBook 的每个对象都可以有映射为 myFriends 的 friend 。
我理解 Reader 或 Maybe 或 State monads 是如何工作的,但在 Continuations monad 上遇到了困难。 像下面这样的例子,吹我的头 type Continuat
协程、延续和生成器之间有什么区别? 最佳答案 我将从生成器开始,因为它们是最简单的情况。正如 @zvolkov 提到的,它们是可以重复调用而不返回的函数/对象,但在调用时将返回(产生)一个值,然后挂起
在下面的代码上调用 await RunAsync(); 时,我希望继续运行 TaskContinuationOptions.OnlyRanToCompletion 继续运行,但是 OnlyOnCanc
我正在使用 jetty-7.4.1.v20110513 和 servlet-api-2.5 我尝试在以下 servlet 中使用连缀。 import java.io.*; import java.
我一直在努力解决 scala 延续的复杂打字问题。我一直在阅读我能找到的所有 Material ,包括关于 continuations 包的引用文档。我想我已经在某种程度上弄清楚了,当你考虑它时它是有
我阅读了很多有关 CosmosDB 分页的文档,并认为 token 应该如下所示: {\"token\":\"xxxxxx\",\"range\":{\"min\":\"xxxxxxxxxx\",\"
我阅读了很多有关 CosmosDB 分页的文档,并认为 token 应该如下所示: {\"token\":\"xxxxxx\",\"range\":{\"min\":\"xxxxxxxxxx\",\"
假设您有服务: interface ISuessService { Task Thing1(); Task Thing2(); } 我有一个扩展方法 ContinueOnUIThrea
我在一段文本上成功应用了 white-space: nowrap。我想知道如果文本被 nowrap 样式截断,是否有可能在文本末尾获得标准的“...”。这是 CSS 可以解决的问题吗?还是我需要 ja
我正在尝试使用 Scala (2.9.0) 延续来构建一个看似阻塞的 API,但这实际上是异步的。假设你想写这样的东西: if(ask("Continue?")) //Prompts Yes/No
我正在使用 Jetty 7 延续来实现一些异步处理。我想做的是开始延续(通过 .suspend()),然后将延续交给其他一些将组成响应的对象,这样效果很好。但是 Jetty 不断将响应(isIniti
协程、延续和生成器之间有什么区别? 最佳答案 我将从生成器开始,因为它们是最简单的情况。正如@zvolkov 提到的,它们是可以重复调用而不返回的函数/对象,但是在调用时将返回(产生)一个值,然后暂停
C++ 11 std::future lacks then 方法将延续附加到 future 。 Boost boost::future provides这个,还有一个example (我无法运行) 我
我在使用 Azure Cosmos DB(通过 .NET SDK)时发现了一些奇怪的东西。 通常,当我使用延续 token 逐页请求查询时,我永远不会获得在创建第一个延续 token 之后创建的文档。
我目前正在实现 System.Web.Http.IActionFilter它调用内部服务来确定当前请求是否可以继续。我遇到的问题是返回 Task基于由 Task 封装的一段逻辑. 一个例子可能会有所帮
我想要一个可序列化的延续,这样我就可以在等待新事件的同时将异步工作流程 pickle 到磁盘。当异步工作流等待 let! 时,它将与唤醒它所需的记录一起保存。而不是内存中的任意 IAsyncResul
我正在努力理解 Continuations 的概念(如 Seaside with Smalltalk 中所使用的)。维基百科的一个片段说: "... refer to first-class cont
我有一个 servlet 过滤器,它充当我的 Web 堆栈的基础。在我的 web.xml 中我有指定我希望过滤器也充当 FORWARD 调度程序。 MyFilter /*
我是一名优秀的程序员,十分优秀!