C# 2D Array erste Zeile entfernen?
Guten Tag ich bin zurzeit an einem Projekt und die erste zeile soll aus dem Array gelöscht werden.
das ist meine Ausgabe und die erste zeile soll komplett gelöscht werden.
und das ist ein teil meines Codes:
for (int i = 0; i < sArrEinkauf.GetLength(0)-1; i++)
{
if (sArrEinkauf[i, 0] == sArrEinkauf[i + 1, 0])
{
int summe = 0;
int temp = 0;
int temp2 = 0;
temp = Convert.ToInt32(sArrEinkauf[i, 4]); temp2 = Convert.ToInt32(sArrEinkauf[i + 1, 4]); summe = temp + temp2; sArrEinkauf[i + 1, 4] = summe.ToString(); sArrEinkauf[i, 0] = "X"; }
} string[,] tmparray = new string[0,0]; string[] temparray = new string[5]; for (int i = 0; i < sArrEinkauf.GetLength(0); i++) { Console.WriteLine("\n"); for (int j = 0; j < sArrEinkauf.GetLength(1); j++) { sArrEinkauf[i, 0] = "A" + sArrEinkauf[i, 0];
Console.Write(sArrEinkauf[i, j] + "\t");
}
}
4 Antworten
Den Code will ich so nicht lesen.
Aber wegen der Frage:
die erste zeile soll aus dem Array gelöscht werden
Das geht nicht.
Du kannst die erste Zeile durch z.B. null ersetzen, aber entfernen ist unmöglich.
Um das zu erreichen musst Du ein neues Array erstellen und dann alles außer den ersten Eintrag rüber kopieren.
Oder Du nutzt die List-Klasse, die kümmert sich um das alles und ist einfach zu nutzen.
array = array.Skip(1).ToArray();
... was effektiv ein neues Array erstellt und rüber kopiert. Das erste Element wird dabei nicht entfernt.
Besser wäre die List-Klasse.
Da wir immer noch keine Deklaration der Array-Variablen haben spekuliere ich mal anhand des Quellcodes aus einem deiner Kommentare, was wohl darin stehen könnte. Vermutlich ist es
String[,] sArrEinkauf;
und die Definition irgendwas wie
sArrEinkauf = new String[n, 5];
in sArrEinkauf[i, 0] steht vermutlich die Artikelbezeichnung oder (sinnvoller) die Artikelnummer, in sArrEinkauf[i, 4] die Anzahl. sArrEinkauf[i, 1..3] weitere Informationen.
Wenn die zweite Dimension des Arrays immer gleich ist und die Array-Elemente sinnvollerweise von verschiedenem Typ sind (was hier höchstwahrscheinlich der Fall ist, sonst wären keine Convert-Anweisungen nötig - die sollte man überhaupt nur bei Ein- und Ausgabe verwenden, aber nie, nie, nie bei internen Berechnungen), schreit das geradezu nach einer struct (oder notfalls nach einer class - beim Abstieg auf Java müsste man sowieso class nehmen). (Autsch)
Außerdem sollte man Löschvorgänge immer von oben anfangen, dann gibt es weniger Probleme mit Umnummerierungen. Oder man erzeugt ein neues Array - dazu kann man eine der Methoden System.Linq.Enumerable.Where verwenden.
Der Aufruf von Skip() und die Zuweisung des Ergebnisses schlägt aus mehreren Gründen fehl:
- sArrEinkauf ist als mehrdimensionales Array zwar ein typloses IEnumerable, aber kein generisches IEnumerable<String>, und System.Linq.Enumerable.Skip() erfordert ein generisches IEnumerable<Typ>
- sArrEinkauf.Skip() würde ein Array vom selben Typ zurückliefern, und das ist ein anderer Typ als sArrEinkauf[i,j]
Außderdem muss das Array sortiert sein, sonst ergibt der Vergleich mit lediglich dem folgenden Element keinen Sinn. Wenn das sichergestellt ist, funktioniert das Verfahren wie erwartet, sonst nicht. Aber System.Linq.Enumerable.OrderBy erfordert wieder ein IEnumerable<Typ>, was ein mehrdimensionales Array eben nicht ist.
-----
Eine eigene Klasse mit eigener Merge-Methode zu verwenden dürfte vermutlich über den Stand eures Kurses hinausführen. Aber tut das auch ein struct oder eine class?
Ich schreibe hier mal einen Code für den Fall einer nicht sortierten Liste:
var arrLength = sArrEinkauf.GetLength(0);
for (i = 0; i < arrLength; ++i) {
for (j = arrLength - 1; j > i; --j) {
if (EinkaeufeEqual(sArrEinkauf, i, j)) {
Merge(sArrEinkauf, i, j);
sArrEinkauf[j,4] = 0.ToString(); // brrr...
}
}
}
oder
var arrLength = sArrEinkauf.GetLength(0);
for (i = arrLength - 1; i >= 0; --i) {
for (j = arrLength - 1; j > i; --j) {
if (EinkaeufeEqual(sArrEinkauf, i, j)) {
Merge(sArrEinkauf, i, j);
--arrLength;
}
}
}
var tempArr = sArrEinkauf;
// CopyTo funktioniert nicht mit mehrdimensionalen Arrays
sArrEinkauf = new String[arrLength, 5];
for (i = 0; i < arrLength; ++i) {
for (j = 0; j < 5; ++j) {
sArrEinkauf[i, j] = tempArr[i, j];
}
}
oder wir bauen eine neue Liste auf, bei der bei jedem neuen Element nachgeschaut wird, ob ein vergleichbares Element schon enthalten ist. Oder - effektiver und der Sache angemessener - wir verwenden als Liste ein Dictionary<Artikelnummer, Artikel> und vergleichen jedesmal, ob das Dictionary den Key Artikelnummer schon enthält. Oder wir leiten eine Klasse von Dictionary<Artikelnummer, Artikel> ab und überschreiben die Add-Methode.
Du möchtest den ersten Wert deines arrays löschen?
ja weil das AX ja die erste Eingabe ausgibt ich jedoch in der zweiten Zeile zusammengefasst habe wenn 2 eingaben doppelt sind
Bist du dir sicher das es auch für 2D Arrays funktioniert ? Ich habe es jetzt so gemacht jedoch kennt er Skip nicht