0

我正在使用内部文件解析库,我用它来解析遗留系统生成的粗糙报告文件。库迭代允许您定义连续应用的 Linq 查询,以在文件中返回一组可枚举的结构。

一个典型的例子如下所示。

var OrderReportParser = 
    from blanks in Rep(BlankLine) // One or more blank lines
    from header1 in TextLine      // A header text line with no useful information
    from hyphenLine in WhiteSpace.And(Rep(Char('-'))).And(BlankLine)
                                  // A line containing only hyphens
    /* ... Snip ... lots of other from clauses */
    from orderId in WhiteSpace.And(AlphaNumeric) // The id of this record
    from price in WhiteSpace.And(Decimal)        // Order price
    from quantity in WhiteSpace.And(Integer)     // Order quantity
    select new OrderLine (orderId, price, quantity)

因为我的大部分文件都是简单的文本,所以输出中不需要由上述语句生成的许多中间结果(如上面示例中的变量blanks, header1, hyphenLine)。

C# 中是否有任何此类机制为中间结果创建变量,或者我是否总是为每个结果创建变量?

我正在考虑_可以以这种方式使用的示例,例如 F# 的变量。请参阅F# 的下划线:为什么不直接创建一个变量名?以元组的上下文为例。

4

1 回答 1

1

如果你问是否有可能做这样的事情:

var OrderReportParser = 
    from Rep(BlankLine)
    from TextLine
    from WhiteSpace.And(Rep(Char('-'))).And(BlankLine)
    ...

...那么答案是否定的。Linq 的设计者可能从未想过人们会想要选择一些东西,然后不看它就立即将其丢弃,因为对于大多数其他 Linq 提供程序来说,这种解析器语法将创建一个巨大的笛卡尔积。(或者如果他们确实考虑过,他们认为它不是一个足够有用的功能。)

你为什么要摆脱变量名呢?我个人认为包含变量名可能会使代码的意图更清晰。如果未使用的变量非常困扰您,我想您可以将它们命名为_1,_2dummy1,dummy2等。这应该清楚地表明它们没有用于任何事情。但他们必须在那里。

编辑:我有一种暗示,_来自 F# 之类的语言的“匿名变量”可能就是你所驾驶的。恐怕答案仍然是否定的。您可以命名第一个变量_,但不允许在第二行重新定义它,就这样吧。此外,该_变量不会具有它在 F# 中的特殊语义,因此您实际上会假装 C# 具有它没有的特性。请记住,C# 从根本上说是一种命令式语言。它有很多函数式的特性,比如 Linq,但它仍然是 C/Java 传统中的一门语言,这些类型的模式匹配特性还没有取得很大进展。我也喜欢这些功能,

于 2013-09-02T14:11:17.047 回答