J'ai utilisé ReSharper pour convertir la fonction en instructions Linq, ce qui peut aider certaines personnes à comprendre ce qui se passe (ou simplement confondre les gens).
public string tostrLinq(int n)
{
return string.Concat(n--, "").Aggregate("", (string current, char c) => current + c);
}
Comme d'autres ont déjà dit, au fond de la int
est entrée concated avec un vide string
qui vous donne essentiellement une représentation de chaîne de la int
. Comme string
implémente IEnumberable
, la boucle foreach
décompose la chaîne en char[]
, en donnant chaque caractère de la chaîne à chaque itération. Le corps de la boucle réunit ensuite les caractères ensemble en tant que chaîne en concaténant chaque char
.
Ainsi, par exemple, entrée donné 5423
, il est converti en "5423"
, puis divisé en "5"
, "4"
, "2"
, "3"
et enfin piquées retour à "5423"
.
Maintenant la partie qui m'a vraiment fait mal pendant un moment était le n--
. Si cela décrémente le int
, alors pourquoi ne recevons-nous pas "5422"
à la place? Cela me n'a pas été clair qu'après avoir lu les MSDN Article: Increment (++) and Decrement (--) Operators
L'incrément et les opérateurs décrémentation sont utilisés comme raccourci pour modifier la valeur stockée dans une variable et accéder à cette valeur. L'opérateur peut être utilisé dans une syntaxe de préfixe ou de suffixe.
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
donc parce que l'opérateur de décrémentation est appliqué à la fin de n
, la valeur de n
est lu et utilisé par string.Concat
avant n
est décrémenté par 1.
à savoir string.Concat(n--,"")
va donner la même sortie que string.Contact(n, ""); n = n - 1;
.
Donc, pour obtenir "5422"
nous changerions à string.Concat(--n, "")
de sorte que n
est décrément première avant qu'il ne soit transmis à string.Contact
.
TL; DR; La fonction est une manière détournée de faire n.ToString()
Fait intéressant, j'ai aussi utilisé ReSharper pour le convertir en une boucle for
mais la fonction ne fonctionne plus comme n
est décrémenté à chaque itération de la boucle, contrairement à la boucle 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;
}
J'espère que ce n'est pas le code de production ... –
Essayez ceci http://stackoverflow.com/questions/17575375/how-do-i-convert-an-int-to-a-string -in-c-sharp-without-using-tostring –
Ceci est une astuce courante de Code Golf, il ne devrait pas être utilisé dans le code de production parce que, comme vous l'avez vu, cela mène à la confusion – TheLethalCoder