Gibt es eine einfache Möglichkeit, ein int in ein Array von Ints jeder Ziffer zu verwandeln?

Sag ich habe

var i = 987654321; 

Gibt es einen einfachen Weg, um ein Array der Ziffern zu erhalten, das Äquivalent von

 var is = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 

ohne .ToString() ing und iterieren über die Zeichen mit int.Parse(x) ?

 public Stack NumbersIn(int value) { if (value == 0) return new Stack(); var numbers = NumbersIn(value / 10); numbers.Push(value % 10); return numbers; } var numbers = NumbersIn(987654321).ToArray(); 

Alternative ohne Rekursion:

 public int[] NumbersIn(int value) { var numbers = new Stack(); for(; value > 0; value /= 10) numbers.Push(value % 10); return numbers.ToArray(); } 

Ich weiß, es gibt wahrscheinlich bessere Antworten als diese, aber hier ist eine andere Version:

Mit yield return können Sie die Ziffern in aufsteigender Reihenfolge (je nach Gewicht oder wie auch immer es genannt wird) zurückgeben.

 public static IEnumerable Digits(this int number) { do { yield return number % 10; number /= 10; } while (number > 0); } 

12345 => 5, 4, 3, 2, 1

Eine weitere Alternative, die keine Rekursion verwendet und einen Stack verwendet, der eine Neuzuordnung bei jeder Einfügung vermeidet (mindestens für die ersten 32 Stellen):

 var list = new Stack(32); var remainder = 123456; do { list.Push(remainder % 10); remainder /= 10; } while (remainder != 0); return list.ToArray(); 

Und ja, diese Methode funktioniert auch für 0 und negative Zahlen.

Interessanterweise geben Sie diesem Algorithmus eine negative Zahl -123456 und Sie erhalten {-1, -2, -3, -4, -5, -6}

Update : Wechsel von der Verwendung von List zu Stack, da dies automatisch die richtige Reihenfolge ergibt.

 var x = new Stack(); do { x.Push(i % 10); i /= 10; } while (i > 0); return x.ToArray(); 

Kurz gesagt: Benutze eine Schleife, die die Zahl modulo 10 (%) teilt, um eine Erinnerung (jede Ziffer) zu bekommen und sie in ein Array zu setzen.

Saiten und kann Spaß (einige der anderen Optionen wäre schneller … aber das ist ziemlich einfach)

 var @is = 987654321.ToString().Select(c => c - 48).ToArray(); 

Dies wandelt sich in eine Zeichenkette und iteriert über die Zeichen, aber es geschieht automatisch und in einem Einzeiler:

 var i = 987654321; var is = i.ToString().Cast().ToArray();