Multidimensional Array Item entfernen

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Multidimensional Array Item entfernen

    Hey
    Also ich hab n 2D Array:


    C#-Quellcode

    1. int[,] arr = {new int[]{1,2,3}, new int[]{4,5,6}, new int[]{6,7,8}};


    Und möchte ohne Linq und ohne List<T> Konvertierungen ein Eintrag entfernen.
    Diesen möchte ich per Index angeben.
    Danach soll der Eintrag gelöscht und die größe des arrays angepasst werden.
    Lösche ich also an Index 1 sollte das Array so aussehen:

    C#-Quellcode

    1. int[,] arr = {new int[]{1,2,3}, new int[]{6,7,8}};


    Wie mache ich das am besten ohne Linq oder List<T> Konvertierung?
    Kann mir jemand helfen?:/

    LG
    Rikudo
    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rikudo“ ()

    @Artentus : 2D Array - Schreibfehler.
    Ja das oben ist ja nur Pseudocode, ich meine damit das ein komplettes item nicht nur teil eines subitems entfernt werden soll, und dadurch auch die Array größe um eins abnehmen sollte...
    C# Developer
    Learning C++
    Nun das ist aber relevant, ob du ein zweidimensionales Array oder ein verschachteltes Array haben willst.
    Das wäre die Deklaration für ein zweidimensionales:

    C#-Quellcode

    1. ​int[,] arr = {{1,2,3}, {4,5,6}, {6,7,8}};
    Und das die für ein geschachteltes:

    C#-Quellcode

    1. ​int[][] arr = {new int[]{1,2,3}, new int[]{4,5,6}, new int[]{6,7,8}};


    Bei ersterem müsste das ganze Array neu angelegt werden, bei zweiterem nur das äußere.
    Das erste ist der Fall den ich habe ..

    C#-Quellcode

    1. int[,] arr = new int[x,3];


    Und item bei x = whatever soll eben das komplette subarray gelöscht werden, so das arr dann quasi einen int[]-Eintrag weniger hat.
    C# Developer
    Learning C++
    Dann, wenn das Ursprungsarray die Größe [a,b] hat, ein Array der Größe [a-1,b] anlegen.
    Bis zum gewünschten Index die Elemente einfach kopieren. Danach den Index selbst überspringen und mit dem kopieren weitermachen, aber eins abziehen. Sollte kein Problem sein vorausgesetzt du weißt, wie du zweidimensionale Arrays kopieren kannst.
    Naja ich habs versucht aber irgendwie verstehe ich das nicht ganz bei multimensionalen arrays, vor allem weil ich keine Subitems löschen darf und irgendwie an einem spezifischen Index das komplette item entfernen muss .. X(
    Kannst du mir evtl. mal ein Beispiel zeigen?
    C# Developer
    Learning C++
    Ich hätte es so gelöst.

    C#-Quellcode

    1. static int[,] RemoveColumn(int[,] source, int index)
    2. {
    3. var result = new int[source.GetUpperBound(0) - 1, source.GetUpperBound(1)];
    4. for (int x = 0; x < index; x++)
    5. {
    6. for (int y = 0; y < source.GetUpperBound(1); y++)
    7. result[x, y] = source[x, y];
    8. }
    9. for (int x = index + 1; x < source.GetUpperBound(0); x++)
    10. {
    11. for (int y = 0; y < source.GetUpperBound(1); y++)
    12. result[x - 1, y] = source[x, y];
    13. }
    14. return result;
    15. }

    Es gibt noch ein paar andere mögliche Lösungen, eine andere zumindest hab ich direkt im Kopf.
    Die Zeitkomplexität ist jedoch bei allen die selbe.

    Artentus schrieb:

    Ich hätte es so gelöst.

    C#-Quellcode

    1. static int[,] RemoveColumn(int[,] source, int index)
    2. {
    3. var result = new int[source.GetUpperBound(0) - 1, source.GetUpperBound(1)];
    4. for (int x = 0; x < index; x++)
    5. {
    6. for (int y = 0; y < source.GetUpperBound(1); y++)
    7. result[x, y] = source[x, y];
    8. }
    9. for (int x = index + 1; x < source.GetUpperBound(0); x++)
    10. {
    11. for (int y = 0; y < source.GetUpperBound(1); y++)
    12. result[x - 1, y] = source[x, y];
    13. }
    14. return result;
    15. }

    Es gibt noch ein paar andere mögliche Lösungen, eine andere zumindest hab ich direkt im Kopf.
    Die Zeitkomplexität ist jedoch bei allen die selbe.


    Hey,
    Danke schonmal, aber das funktioniert leider nicht :D
    Folgendes, mein beispiels array sieht so aus:

    C#-Quellcode

    1. int[,] arr = { { 1, 1, 2 }, { 2, 2, 3 }, { 3, 3, 4 }, { 4, 4, 5 } };


    Also wenn mans im debugger anguggt so:



    Nachdem ich versuche index 1 wie folgt rauszufiltern bekomme ich aber das:

    C#-Quellcode

    1. var a = RemoveColumn(arr, 1);




    Das ist nicht das korrekte Ergebnis, stattdessen sollte es wie folgt aussehen. Alles außer dem rot eingekreisten sollte nach dem filtern vorhanden sein :



    Also alles außer den items die 1 als ersten index haben..
    Die größe des returnten int[,] müsste dann so sein :

    C#-Quellcode

    1. int[3,3];
    da ja ein kompletter Eintrag entfernt wurde.
    Was stimmt mit der Funktion nicht? ;o
    C# Developer
    Learning C++
    Ich hab wohl schon zu lange nicht mehr programmiert. ^^
    GetUpperBound gibt nicht die Länge sondern den letzten Index zurück, da muss natürlich alles um eins verschoben werden.

    C#-Quellcode

    1. static int[,] RemoveColumn(int[,] source, int index)
    2. {
    3. var result = new int[source.GetUpperBound(0), source.GetUpperBound(1) + 1];
    4. for (int x = 0; x < index; x++)
    5. {
    6. for (int y = 0; y <= source.GetUpperBound(1); y++)
    7. result[x, y] = source[x, y];
    8. }
    9. for (int x = index + 1; x <= source.GetUpperBound(0); x++)
    10. {
    11. for (int y = 0; y <= source.GetUpperBound(1); y++)
    12. result[x - 1, y] = source[x, y];
    13. }
    14. return result;
    15. }