Repères
Tout d'abord, vous devez décider de ce que vous entendez par "meilleure" solution, bien sûr, qui tient compte de l'efficacité de l'algorithme, sa lisibilité/maintenabilité, et la probabilité d'insectes rampant dans l'avenir. Attention les tests unitaires peut généralement éviter ces problèmes, cependant.
J'ai couru chacun de ces exemples, 10 millions de fois, et les résultats de la valeur est le nombre d' ElapsedTicks
qui ont réussi.
Sans plus tarder, du plus lent au plus rapide, les algorithmes sont:
La conversion d'une chaîne de caractères, prendre la première à caractère
int firstDigit = (int)(Value.ToString()[0]) - 48;
Résultats:
12,552,893 ticks
À l'aide d'un logarithme
int firstDigit = (int)(Value / Math.Pow(10, (int)Math.Floor(Math.Log10(Value))));
Résultats:
9,165,089 ticks
Boucle
while (number >= 10)
number /= 10;
Résultats:
6,001,570 ticks
Conditions
int firstdigit;
if (Value < 10)
firstdigit = Value;
else if (Value < 100)
firstdigit = Value / 10;
else if (Value < 1000)
firstdigit = Value / 100;
else if (Value < 10000)
firstdigit = Value / 1000;
else if (Value < 100000)
firstdigit = Value / 10000;
else if (Value < 1000000)
firstdigit = Value / 100000;
else if (Value < 10000000)
firstdigit = Value / 1000000;
else if (Value < 100000000)
firstdigit = Value / 10000000;
else if (Value < 1000000000)
firstdigit = Value / 100000000;
else
firstdigit = Value / 1000000000;
Résultats:
1,421,659 ticks
Déroulé et optimisé boucle
if (i >= 100000000) i /= 100000000;
if (i >= 10000) i /= 10000;
if (i >= 100) i /= 100;
if (i >= 10) i /= 10;
Résultats:
1,399,788 ticks
Note:
chacun des appels de test Random.Next()
pour obtenir le prochain int