Я использовал ReSharper для преобразования функции в выражения Linq, которые могут помочь некоторым людям понять, что происходит (или просто путать людей еще больше).
public string tostrLinq(int n)
{
return string.Concat(n--, "").Aggregate("", (string current, char c) => current + c);
}
Как другие уже говорили, в основном, введенный int
является concated с пустым string
, который в основном дает вам строковое представление о int
. Поскольку string
реализует IEnumberable
, цикл foreach
разбивает строку на char[]
, предоставляя каждому символу строки на каждой итерации. Тело цикла просто присоединяет символы назад вместе в виде строки, объединяя каждый char
.
Так, например, учитывая ввод 5423
, он преобразуется в "5423"
, а затем разбить на "5"
, "4"
, "2"
, "3"
и, наконец, сшитые назад "5423"
.
Теперь часть, которая действительно повредила мне голову, была n--
. Если это уменьшает int
, то почему бы нам не вернуть "5422"
? Это было не ясно мне, пока я не прочитал MSDN Article: Increment (++) and Decrement (--) Operators
инкремента и декремента используются в качестве ярлыка для изменения значение, сохраненное в переменной и получить доступ к этому значение. Любой оператор может использоваться в синтаксисе префикса или постфикса.
If | Equivalent Action | Return value
=====================================
++variable | variable += 1 | value of variable after incrementing
variable++ | variable += 1 | value of variable before incrementing
--variable | variable -= 1 | value of variable after decrementing
variable-- | variable -= 1 | value of variable before decrementing
Так, потому что оператор декремента применяется в конце, чтобы n
, значение n
считывается и используется string.Concat
перед тем n
уменьшается на 1.
Т.е. string.Concat(n--,"")
будет давать тот же результат, что и string.Contact(n, ""); n = n - 1;
.
Таким образом, чтобы "5422"
мы изменили бы его string.Concat(--n, "")
так что n
является декремент первым, прежде чем он передается string.Contact
.
TL; DR; Функция является окрест способ сделать n.ToString()
Интересно, что я не использовал ReSharper, чтобы преобразовать его в for
цикла, но функция больше не работает как n
декрементируется на каждой итерации для цикла, в отличие от цикла foreach
:
public string tostrFor(int n)
{
string s = "";
for (int index = 0; index < string.Concat(n--, "").Length; index++)
{
char c = string.Concat(n--, "")[index];
s = s + c;
}
return s;
}
Надеюсь, это не производственный код ... –
Попробуйте это http://stackoverflow.com/questions/17575375/how-do-i-convert-an-int-to-a-string -in-c-sharp-without-use-tostring –
Это общий трюк Code Golf, он не должен использоваться в производственном коде, хотя, как вы видели, это приводит к путанице. – TheLethalCoder