我在FizzBuzz测试中找到了这个codegolf的答案,经过检查后我意识到我不知道它是如何工作的,所以我开始调查:
for(int i=1; i<101;i++)
System.Console.Write($"{(i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");
我把它放入dotnetfiddle并建立第一部分的工作原理如下:
{(BOOL?0:i):#}
当BOOL为true时,条件表达式返回0,否则返回数字。
但是,除非它是<> 0
,否则不会返回该数字。我猜这是:#
角色的工作。我找不到有关:#
角色工作的任何文档。任何人都可以解释冒号/哈希或指向正确的方向吗?
第二部分:
{VALUE:;;Fizz}
当VALUE = 0
然后没有打印。我假设这是由第一个;
字符[结束语句]决定的。第二个;
角色决定“如果VALUE <> 0
然后打印出我之后的东西。”
再次,有没有人有关于在字符串插值中使用分号的文档,因为我找不到任何有用的东西。
感谢所有评论者!反应快。
这里定义了#(自定义说明符)
“#”自定义格式说明符用作数字占位符符号。如果格式化的值在格式字符串中出现“#”符号的位置有一个数字,则该数字将复制到结果字符串。否则,结果字符串中的任何位置都不存储任何内容。请注意,即使零是字符串中的唯一数字,此说明符也不会显示不是有效数字的零。仅当它是显示的数字中的有效数字时,它才会显示零。
的;在这里定义(章节分隔符):
分号(;)是条件格式说明符,它根据数值是正数,负数还是零来对数字应用不同的格式。要产生此行为,自定义格式字符串最多可包含由分号分隔的三个部分...
这些都在String Interpolation documentation中有所涉及,尤其是关于Structure of an Interpolated String的部分,其中包括:
{<interpolatedExpression>[,<alignment>][:<formatString>]}
以及这三个部分中每个部分的更详细描述。
该结构的格式字符串部分在单独的页面上定义,您可以在其中使用standard和custom格式作为数字类型,以及standard和custom格式用于日期和时间类型。还有Enum values的选项,你甚至可以创建自己的custom format provider。
值得一看的是自定义格式提供程序文档,因为它还会引导您进入FormattableString
类型。文档没有很好地说明这一点,但我理解这种类型理论上可以避免在循环中使用时为每次迭代重新解析插值字符串,从而可能提高性能(尽管在实践中,没有此时的差异)。我有written about this before,我的结论是MS需要以更好的方式将其构建到框架中。