1

我正在使用 Sprache 库,它允许使用 LINQ 构建解析器。但是,有时我需要解析一些东西然后丢弃结果。例如:

from key in Identifier
from __ws1 in OptionalWhitespace
from __setter in PropertySetter
from __ws2 in OptionalWhitespace
from value in PropertyValue
select ...

我不需要以 为前缀的三个变量中的任何一个__,因此似乎没有必要用它们污染命名空间。

有什么方法可以执行 LINQ 查询并丢弃这三个结果?

4

3 回答 3

2

由于没有深入了解 Sprache,我已经超级简化了示例以了解问题域。

以这个多 from 语句的例子(使用 LinqPad)为例,我们只对from的一个值感兴趣。所以在这个任意的例子中,我们想知道人和蛋糕的所有组合,但只对蛋糕的名字感兴趣。

var people = new List<string> {
    "Billy", "Jimmy"
};

var cake = new List<string> {
    "Carrot Cake", "Chocolate Cake"
};

(from p in people
from c in cake
select new
{
    c
}).Dump();

多个 from 语句可以被认为是嵌套的 foreach 循环,最终成为一个交叉连接(如此处讨论的LINQ Join with Multiple From Clauses

所以让我们假设这是 Sprache 的作者的意图,如果我们尝试用流畅的语法重写它(如这里讨论的:https ://codeblog.jonskeet.uk/2011/01/28/reimplementing-linq-to- objects-part-41-how-query-expressions-work/)它最终成为一个SelectMany().

我们最终得到类似的东西:

people.SelectMany(p => cake, (p, c) => new { c }).Dump();

你仍然以“人”参数结束。

所以我建议为了保持 Sprache 的意图,没有办法没有 __ 语句。除非也许自己建立表达式树,但我无法想象那会是富有成效的。

于 2017-12-15T09:44:24.187 回答
1

在这种特殊情况下,您可以使用Then一次丢弃所有不相关的部分:

var parser =
    from key in Identifier
    from _ in OptionalWhitespace
        .Then(_ => PropertySetter)
        .Then(_ => OptionalWhitespace)
    from value in PropertyValue
    select new
    {
        key,
        value
    };

但是,如果不相关的部分不立即相互跟随,则在一般情况下将无济于事。

于 2018-01-05T02:11:36.397 回答
0

Sprache 为解析器函数的一元绑定实现了 LINQ 查询方法,例如解析器组合器。(LINQ 可用于比查询 EF DbSets 更有趣的事情。)遗憾的是,LINQ 查询范围变量(尚)不支持丢弃,因此您的“_”范围变量将在范围内发生冲突。当我在查询中有多个变量时,我通常将不需要的范围变量命名为“_N”(其中 N 在 [1..] 中),并希望在它们得到支持时记住使用正确的丢弃。

于 2020-03-08T23:53:07.270 回答