Как перевести запрос 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).

Другие вопросы по тегам