放弃林克的中级成绩

本文关键字:林克 放弃 | 更新日期: 2023-09-27 18:29:58

我使用的是一个内部文件解析库,用于解析遗留系统生成的粗糙报告文件。库迭代允许您定义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)

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

C#中有没有这样的机制为中间结果创建变量,或者我总是为每个结果创建变量?

我想到了F#的_变量这样的例子,它可以以这种方式使用。参见F#';s下划线:为什么不创建一个变量名呢?例如在Tuples的上下文中。

放弃林克的中级成绩

如果你问是否可以这样做:

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

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

为什么要去掉变量名?就我个人而言,我认为包含变量名可能会使代码的意图更加清晰。如果未使用的变量让你很烦恼,我想你可以给它们命名为_1_2dummy1dummy2等。这应该很清楚,它们没有用于任何事情。但他们必须在那里。

编辑:我有一点预感,F#等语言中的"匿名变量"_可能就是你想要的。恐怕答案仍然是否定的。您可以将第一个变量命名为_,但不允许在第二行重新定义它,所以就这样了。此外,_变量没有F#中的特殊语义,所以您实际上是在假装C#有它没有的功能。请记住,C#从根本上说是一种命令式语言。它有很多函数式风格的特性,比如Linq,但它在很大程度上仍然是C/Java传统中的一种语言,在那里,这些模式匹配特性还没有取得多大进展。我也喜欢这些功能,但在编写C#时,你必须有一点不同的想法。