【问题标题】:Discard rows of a LINQ "from" statement丢弃 LINQ“from”语句的行
【发布时间】:2020-03-09 07:53:07
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我猜你在某个地方有一个 where 或 join 可以将表格链接在一起?您能否稍微扩展您的示例,以便我们了解其他表的使用方式?
  • @Alex KeySmith 这不是数据库查询,而是使用 Sprache 库构建的解析器规则。
  • 抱歉,我对“表”一词的使用可能没有意义。我不确定您的其他 集合 是如何使用的。我猜你试图获得以某种方式嵌套在标识符中的 ProperyValue?您能否稍微扩展您的示例,因为它有助于理解您的问题域。
  • 哦,我明白了,查看 sprache 网站上的示例,我猜这些示例出现在 select 语句中?也可能不是这样。
  • 在他们的示例中,这只是 Sprache 构建表达式的一种方式,即使您不需要它们。有点奇怪,可能是我对表达式缺乏深入的理解,即使它没有在 select 或 where 或显然在自己的代码中的任何内容中使用,它仍然被使用。

标签: c# linq parsing sprache


【解决方案1】:

没有深入了解 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 的意图,没有办法没有 __ 语句。除非也许自己建立表达式树,但我无法想象那会是富有成效的。

【讨论】:

  • 你已经完全理解了这个问题——很遗憾没有办法丢弃这些值。我想这不是一件常见的事情。感谢您的回答
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      相关资源
      最近更新 更多