Hallo,
in einem Algorythmus wird ein zweidimensionales Array eines Werttyps (eine Enumeration) iteriert.
Innerhalb der doppelten Schleife müsste ich dann den Ausdruck "array[x][y]" verwenden. Da der Name etwas länger ist (eigentlich nicht "array") will ich den nicht jedes Mal neu tippen oder kopieren.
Wenn ich folgendes schreibe, wird der Wert aber kopiert.
typ kurzName = array[x][y];
Ich brauche aber eine Referenz (bzw. "Alias") darauf, damit der Wert im Array auch geändert wird.
Das ist eigentlich eine Grundlagenfrage, trotzdem habe ich auch nach einiger Sucherei nichts gefunden. "Boxing" scheint mir nicht der richtige Weg zu sein. Gibts dazu eine elegante Lösung? oder Copy+Paste?
MfG janismac
Eine Enumeration wirst du noch schneller kopieren können, als eine Referenz. Enums werden wohl 4 Byte brauchen, Referenzen unter .NET 12 Byte.
Da der Name etwas länger ist (eigentlich nicht "array") will ich den nicht jedes Mal neu tippen oder kopieren.
Zwei Möglichkeiten:1.Nimm einen kürzeren Namen 1.Schreibe eine Methode, die den Zugriff erledigt
Es geht mir nicht um Performance, sondern um die Geschwindigkeit beim Programmieren.
Und das eigentliche Problem ist nicht der lange Arrayname (dafür gibts ja IntelliSense), sondern der Index "[x][y]".
Um den einzutippen brauch ich mindestens so lange wie für copy+paste. Gut, das ist kein tragisches Problem, man könnte damit leben 😄. Aber, wenn es eleganter geht, warum nicht?
Ich brauche aber eine Referenz (bzw. "Alias") darauf, damit der Wert im Array auch geändert wird.
Das habe ich überlesen, sorry. Das geht dann nicht. Auch Boxing bringt es dir nichts, weil das ist dann auch nur eine Kopie, verpackt in ein Objekt.
Hallo janismac,
dann schreib doch:
T[][] myArray = ....
for (int i = 0; i < myArray.Lenght; ++i)
{
T[] tmp = myArray[i];
for (int j = 0; j < tmp.Length; ++j)
{
T value = tmp[j];
}
}
Ist sogar von der Performance her besser, da in der inneren Schleife Range-Check-Elimination angewandt werden kann, allerdings wirkt sich dies nur bei sehr vielen Schleifendurchläufen aus und es sollte "premature optimization is the root of all evil" (Donald E. Knuth) bedacht werden.
Hallo Coder007,
Referenzen unter .NET 12 Byte.
Referenzen brauchen 4 Byte auf 32bit-Systemen und 8 Byte auf 64bit-Systemen. Für die Objektgröße schauts anders aus (klar, je nach Größe). Für Arrays hab ich Arrays initialisieren etwas dazu geschrieben.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Bleibt das Problem dabei nicht bestehen?
Also wenn ich das so weiterführe:
T[][] myArray = ....
for (int i = 0; i < myArray.Lenght; ++i)
{
T[] tmp = myArray[i];
for (int j = 0; j < tmp.Length; ++j)
{
T value = tmp[j];
value = 123;
}
}
Console.Write(myArray[0][0]);
Dann steht die "123" in "value", aber nicht in "myArray[0][0]". Werttypen werden doch kopiert. Oder?
Hallo janismac,
Werttypen werden doch kopiert. Oder?
Ja, so ist es. Schreib halt
tmp[j] = 123;
Bei normalen int
schreibst du es ja auch nicht anders. Wenn du das nicht willst, musst du es durch ein Objekt kapseln (1. Klasse mit Eigenschaft vom Typ T, 2. Interface od. 3. den Werttyp durch einen Referenztyp ersetzen, siehe auch Boxing/Unboxing: Es wird in Büchern immer erwähnt, aber welchen Vorteil bringt es mit sich?), aber da ist wohl der Aufwand noch höher.
Du kannst dir auch ein Snippet für VS erstellen od. für tmp
eine noch kürzere Bezeichnung wählen, achte aber auf die Lesbarkeit vom Code.
Jetzt sind wir aber bei den Grundlagen angelangt. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"