我为FizzBuzz测试找到了这个代码高尔夫的答案,在仔细检查了一下之后,我意识到我不知道它的实际工作原理,所以我开始调查:
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
时,什么也不打印。我假设这是由第一个;
字符[end statement]确定的。第二个;
字符确定“如果VALUE <> 0
然后打印我后面的内容。”
同样,没有人有关于在字符串插值中使用分号的文档,因为我找不到任何有用的东西。
答案 0 :(得分:2)
感谢所有评论者!快速响应。
编号在此处定义(自定义说明符)
“#”自定义格式说明符用作数字占位符。 如果要格式化的值在以下位置具有数字 “#”符号出现在格式字符串中,将该数字复制到 结果字符串。否则,将不会在该位置存储任何内容 结果字符串。请注意,此说明符从不显示零 不是有效数字,即使零是 串。仅当它是有效数字时,才会显示零。 显示的数字。
The;在此处定义(分隔符):
分号(;)是适用的条件格式说明符 不同的格式设置为数字,具体取决于其值是否为 正,负或零。要产生此行为,请使用自定义格式 字符串最多可以包含三个由分号分隔的部分。
答案 1 :(得分:2)
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需要以更好的方式将其构建到框架中。