C# 2D Array erste Zeile entfernen?

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.

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

array = array.Skip(1).ToArray();

Woher ich das weiß:eigene Erfahrung

poposalat 
Beitragsersteller
 04.05.2020, 15:36

Bist du dir sicher das es auch für 2D Arrays funktioniert ? Ich habe es jetzt so gemacht jedoch kennt er Skip nicht

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";
                    sArrEinkauf[i,0] = sArrEinkauf.Skip(1).ToArray();
                }


            }
            //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");
                }
            }


            Console.ReadKey();




            return EinkaufSortieren(sArrEinkauf);
            }
0
PWolff  05.05.2020, 14:58
@poposalat

Skip funktioniert nur mit eindimensionalen Arrays.

0
Palladin007  04.05.2020, 15:58

... was effektiv ein neues Array erstellt und rüber kopiert. Das erste Element wird dabei nicht entfernt.

Besser wäre die List-Klasse.

1

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.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Du möchtest den ersten Wert deines arrays löschen?


poposalat 
Beitragsersteller
 04.05.2020, 15:29

ja weil das AX ja die erste Eingabe ausgibt ich jedoch in der zweiten Zeile zusammengefasst habe wenn 2 eingaben doppelt sind

1