Wie "verschiebe" ich Werte von Arrays in C#?

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.

Woher ich das weiß:Berufserfahrung – ich arbeite schon sehr lange im EDV Bereich, viele Sparten

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!

user373h383  14.05.2018, 18:01

int[] Array = new int[10];

//Befüllen

int[] ArrayKopie = Array;

//Schleife

Array = ArrayKopie;

0
Baumbart13 
Fragesteller
 14.05.2018, 18:04

Vielen vielen Dank😁😁

0
user373h383  14.05.2018, 18:11
@Baumbart13

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...

0

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 ... :-)

Woher ich das weiß:Hobby – Poweruser mit dem Bestreben, jedes System auszureizen