Я нашел этот ответ codegolf для теста 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
тогда ничего не печатается. Я предполагаю, что это определяется первым ;
символ [конечный оператор]. Второе ;
символ определяет "если VALUE <> 0
то печатать то, что за мной".
Опять же, есть ли у кого-нибудь документация по использованию точки с запятой в интерполяции строк, поскольку я не могу найти ничего полезного. Спасибо!
Спасибо всем комментаторам! Быстрый ответ.
Здесь определяется # (пользовательский спецификатор)
Спецификатор пользовательского формата "#" служит символом-заполнителем. Если форматируемое значение имеет цифру в позиции, где в строке формата появляется символ "#", эта цифра копируется в строку результата. В противном случае в результирующей строке ничего не сохраняется в этой позиции. Обратите внимание, что этот спецификатор никогда не отображает ноль, который не является значащей цифрой, даже если ноль является единственной цифрой в строке. Он будет отображать ноль, только если это значащая цифра в отображаемом числе.
The; определяется здесь (раздел Seperator):
Точка с запятой (;) является спецификатором условного формата, который применяет различное форматирование к числу в зависимости от того, является ли его значение положительным, отрицательным или нулевым. Чтобы создать такое поведение, строка пользовательского формата может содержать до трех разделов, разделенных точками с запятой...
Все это описано в документации по интерполяции строк, особенно в разделе " Структура интерполированной строки", который включает в себя следующее:
{<interpolatedExpression>[,<alignment>][:<formatString>]}
вместе с более подробным описанием для каждого из этих трех разделов.
Часть строки формата этой структуры определена на отдельных страницах, где вы можете использовать стандартные и пользовательские форматы для числовых типов, а также стандартные и пользовательские форматы для типов даты и времени. Есть также опции для значений Enum, и вы даже можете создать свой собственный поставщик форматов.
Стоит взглянуть на документацию поставщика нестандартных форматов только потому, что это также приведет вас к типу FormattableString
. Это не очень хорошо отражено в документации, но я понимаю, что этот тип теоретически может позволить вам избежать повторного разбора интерполированной строки для каждой итерации при использовании в цикле, что потенциально повышает производительность (хотя на практике нет разница в это время). Я уже писал об этом раньше, и я пришел к выводу, что MS нужно встроить это в структуру лучше.
what other 'advanced' functionality exists in string interpolation that I may not be aware of?
будет слишком широким, вы, вероятно, должны удалить это