Wie "verschiebe" ich Werte von Arrays in C#?
Moin, liebe Community, die Aufgabenstellung ist folgend:
Wir haben einen INT-Array mit 10 Stellen und werden nach der reihe alle gefüllt (zB Array[0]=1; Array[1]=2; .... Array[9]=10;). Danach müssen die Werte um eines verschoben werden, dass es so aus: Array[0]=10; Array[1]=1;Array[2]=2; ..... Array[9]=9;
An sich ist das für mich nicht schwer, aber ich habe das Problem, dass ich nicht weiß, wie ich den alten Wert von "Array[9]" auf den neuen Wert von "Array[0]" schreibe
Mein Ansatz wäre wiefolgt:
int[] Array = new int[21]; int Zwischenspeicher = 0, Zwischenspeicher1 = 0; Random RNG = new Random();
for(int i = 0; i < Array.Length-1; i++) { //Array mit Zahlen füllen Array[i] = RNG.Next(1, 101); }
Array[Array.Length-1] = Zwischenspeicher1;
for(int i = Array.Length; i>0; i--) { //Array[i] wird in Zwischenspeicher verschoben Array[i+1] = Array[i]; } Array[0] = Zwischenspeicher1
//Sollte jetzt den ursprünglichen Wert //von Array[Array.Length-1] haben Console.Write("{0} -> {1}"Array[Array.Length-1] , Array[0]);
Hätte jemand einen guten Verbesserungsvorschlag für einen C#-Neuling? 😅 Danke schon im Vorraus
3 Antworten
ohne Formatierung ist das recht schlecht zu lesen.
Wenn ich die Aufgabenstellung richtig verstanden habe, dann würde ich das nicht stellenweise kopieren, sondern arrayweise.
Also Du kopierst das array in ein neues und schneidest die Enden ab. Du kannst auch Schnipsel kopieren und in ein neues array zusammenkleben.
C# selbst spreche ich nicht, doch die Grundprinzipien sollten überall ähnlich sein: Sprich' auf ein gesamtes Array zeigt ein Pointer und der ist viel schneller zu handhaben, als würde ich alle Stellen zugreifen oder gar über die Längenfunktion arbeiten. Wird einmal die Array-Länge mit Ein-Schritt-Operanden verändert, macht das auch flinke Computer müde. Im Testprogramm nicht, doch wenn Du einmal ein paar hundert Arrays hast, mit ein paar Millionen Operationen, - spürbar.
ganz einfach:
int[] Array = new int[10];
//Werte zuweisen
for(int i = 0; i < Array.Lengh; i++)
{
if(i < Array.Lengh - 1)
Array[i] = Array[i + 1];
else
Array[i] = Array[0];
}
Dadurch bekommt jede Stelle den der nächsten, nur die letzte wird besonders behandelt.
Edit: Du musst dir vorher eine Kopie des Arrays anlegen und die Kopie befüllen!
Das mit der Kopie in meinem Beispiel ist bestimmt noch falsch, ich glaube in dem Beispiel oben kopiere ich nur den Pointer. Aber du brauchst auf jeden Fall zwei Arrays, eins als Buffer und eins mit den Werten...
int[] Array = new int[10];
//Befüllen
int[] ArrayKopie = Array;
//Schleife
Array = ArrayKopie;
Oder ganz anders als flotter Vierzeiler: 🤓
T[] SwapArray<T>(T[] array)
=> array.Select((item, index) => (item, index: index + 1))
.OrderBy(element => element.index % array.Length)
.Select(element => element.item)
.ToArray();
Erklärung: Der Code verwendet LINQ (Language Integrated Queries). In Zeile 1 wird jedem Arrayfeld sein Index zugeordnet und dann um 1 erhöht. In Zeile 2 werden alle Felder nach dem Index geordnet, nachdem (!) dieser modulo der Länge des Arrays genommen wurde, dadurch wird das letzte Feld mit dem Index array.Length an die erste Stelle geschoben. Danach wird nur noch der Index wieder aus der Aufzählung entfernt.
Oder even shorter:
T[] SwapArray2<T>(T[] array)
=> array.Skip(1).Concat(new[] {array.First()}).ToArray();
Der Code gibt das Array zurück, nachdem das erste Element übersprungen wurde, und fügt es dafür hinten wieder an. Geschmacksfrage ... :-)
Vielen vielen Dank😁😁