如何将 linq 查询转换为方法调用

how to translate linq query to method calls

我正在尝试使用 Sprache 制作解析器 我正在使用 F#。我见过的所有库示例都使用 Linq 查询语法。我尝试使用 "query" 计算表达式将 linq 转换为 f#,但我迷路了。

这是我一直在使用的示例。

[TestClass]
public class tests
{
    [TestMethod]
    public void test()
    {
        var input = "\"this is text\"";
        var content = Class1.Quoted.Parse(input);
        Assert.AreEqual("this is text", content);
    }
}
public class Class1
{
    public static readonly Parser<string> Quoted =
        (from open in Parse.Char('"')
         from content in Parse.CharExcept('"').Many().Text()
         from close in Parse.Char('"')
         select content);

    public static readonly Parser<string> Quoted2 =
        Parse.Char('"').SelectMany(open => 
        Parse.CharExcept('"').Many().Text(), ())
}

最明显的方法是将 linq 转换为方法调用,但我不知道该怎么做。我试着查看 ILSpy,但这让我有点困惑。

Linq 查询如何看起来像直接方法调用?

翻译你的例子

(from open in Parse.Char('"')
from content in Parse.CharExcept('"').Many().Text()
from close in Parse.Char('"')
select content);

给予

(Parse.Char('"')
.SelectMany(open => Parse.CharExcept('"').Many().Text(), (open, content) => new {open, content})
.SelectMany(@t => Parse.Char('"'), (@t, close) => @t.content));

注意:采用更符合 F# 习惯的方法可能会很棘手,因为计算表达式似乎没有等同于 C# LINQ 语法预编译到的 SelectMany 的重载(并且由 Sprache 提供)。