如何将 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 提供)。
我正在尝试使用 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 提供)。