Как перевести запрос linq на вызовы метода
Я пытаюсь сделать парсер с помощью Sprache Я использую F#. Все примеры, которые я когда-либо видел для библиотеки, используют синтаксис запроса Linq. Я пытался перевести linq в F#, используя выражение для вычисления "query", но там я заблудился.
Вот пример, который я использовал.
[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 как прямой вызов метода?
1 ответ
Перевод вашего примера
(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));
NB. Переход к подходу, более идиоматическому F#, может быть сложным, потому что выражения вычислений не имеют эквивалента перегрузке SelectMany, к которой предварительно компилируется синтаксис C# LINQ (и который обеспечивает Sprache).