Announcement

Collapse
No announcement yet.

Probleme mit Mehrdim. Array

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Mehrdim. Array

    Hallo alle zusammen.

    Mich plagt zur Zeit ein wenig mein kleines Spielchen, was ich derzeit schreibe. Das Spiel besitzt ein Spielfeld, welches wiederrum ein Array[,] Member besitzt, der mit Verweistypen gefüllt wird.

    Folgendes Problem stellt sich mir nun dar: Wenn ich das Array zurückgebe (bzw. ein Objekt der Klasse, die das Array enthält), dann ist der ganze Spaß wunderbar manipulierbar, denn man kann die Verweise ja je nach belieben ändern.

    Bei einem eindimensionalen Array wäre ja die Konvertierung in eine entsprechende von Collection abgeleitete Klasse eine mögliche Lösung. Wie könnte man sowas mit einem mehrdimensionalem Array lösen? Ich habe da bis jetzt nur 2 Ansätze:
    • Anstelle des mehrdimensionalen Arrays ein jagged Array benutzen
    • Das Ganze Serialisieren und Deserialisieren (<- hört sich für mich nach keiner guten Lösung an)


    Jemand vielleicht noch andere Lösungsansätze?

    Mfg Myst

  • #2
    Irgendwie seh ich jetzt dein Problem nicht? oder hast du das gar nicht erwähnt.

    Wenn du eine Listenentsprechung des Array möchtest kannst du die generischen Listen einfach schachteln.

    Code:
    List<List<MeineSpielfeldZellenKlasse>> matrix = new List<List<MeineSpielfeldZellenKlasse>>();

    Comment


    • #3
      Irgendwie seh ich jetzt dein Problem nicht? oder hast du das gar nicht erwähnt.
      Ich hätte wahrscheinlich stärker zum Ausdruck bringen sollen, dass ich nicht möchte, dass das zurückgegebene mehrdimensionale Array manipulierbar (im Sinne von Verweise austauschen) ist.

      Ich habe mir deinen Vorschlag angeschaut und das wäre natürlich auch eine Lösung, da ich so auch ReadOnlyCollections definieren könnte. Das Ganze verhält sich dann beim Zugriff wie ein jagged Array, nicht? (Und die Signatur der Methode, die das Array zurückgibt müsste ein wenig eigenartig aussehen )

      Um das noch ein wenig zu verbessen könnte man doch auch eine Klasse definieren, die intern ein mehrdimensionales Array verwaltet (private) und Schnittstellen wie IList implementiert, nicht? Ist es so möglich das selbe Zugriffsverhalten wie bei einem mehrdimensionalen Array zu bekommen?

      Mfg Myst

      PS: Ich merk schon, ich drücke mich heute nicht sonderlich klar aus :/

      Comment


      • #4
        Um das noch ein wenig zu verbessen könnte man doch auch eine Klasse definieren, die intern ein mehrdimensionales Array verwaltet (private) und Schnittstellen wie IList implementiert, nicht?
        IList hat auch nur einen generischen Parameter dann fängst du an das IList Interface zu schachten. Also IList<IList<T>> ist wohl nicht einfacher zu implementieren als gleich eine geschachtelte Collection zu nehmen.

        Bei einer ReadOnlyCollection habe ich Vorstellungsproblem die sauber zu befüllen, mag aber einfach sein und ich hab gerade nur eine Denkblockade. Deshalb würde ich von Collection ausgehen und dort die virtuellen Methoden zum verändern überschreiben (InsertItem,DeleteItem,SetItem). Damit sind auch Add,Delete etc. ausgehebelt (die selbst nicht virtuell sind und nicht überschrieben werden können). Dieser Klasse könnte man dann einen sauberen Konstruktor zum befüllen verpassen.

        Guckst du hier wie ich mir das vorstelle.

        Code:
            private class ReadOnlyTwoDimensionalCollection<T> : Collection<Collection<T>>
            {
                private List<List<T>> list = new List<List<T>>();
        
                // Indexer um Array Zugriffe wie bei multidimensionalen (nicht jagged) Arrays zu erlauben
                public T this[int index1,int index2]
                {
                    get
                    {
                        return list[index1][index2];
                    }
        
                    set
                    {
                        list[index1][index2] = value;
                    }
                }
        
                protected override void InsertItem(int index, Collection<T> item)
                {
                    throw new NotImplementedException("ReadOnly Collection. InsertItem nicht implementiert.");  
                } 
            }

        Comment


        • #5
          Hallo

          Bei einer ReadOnlyCollection habe ich Vorstellungsproblem die sauber zu befüllen,[...]
          Korrekt. Die ReadOnlyCollection<ReadOnlyCollection<T>> zu befüllen war ein ziemlicher graus. Ich habe dies deshalb nach einiger Zeit abgebrochen, als ich gemerkt hatte, in was das ausartet.

          An deiner Idee hatte mich ein wenig die Komplexität (es soll ein OS-Projekt für Anfänger werden) abgeschreckt und dass der Aufruf der Add\Delete etc. in einer Exception (oder in gar nicht - je nachdem was man implementiert) endet. Das fände ich für Anfänger ein wenig verwirrend.

          Ich habe nun eine simple Methode gefunden, die mir als sicher erscheint und die von mir gewünschte Funktionalität mitbringt. Und zwar wird die Klasse der Verweise der Verweistypen, die in dem mehrdimensionalen Array gespeichert sind, mit dem ICloneable ausgestattet, dessen Implementierung flache (ausreichend) Kopien anlegt und einen neuen Verweis auf diese Kopien zurückgibt.

          Das Spielfeld an sich besitzt keinerlei öffentlichen Zugriff auf das interne Array außer einem Indexer, der nur ein Get-Accessor besitzt, in dem die Kopie des angeforderten Verweises zurückgegeben wird.

          Wenn sich der Spaß nun auchnoch Serialisieren kann (muss ich mich noch einlesen), dann behalte ich diese Implementierung bei.

          Danke für deinen Anstoß in die richtige Richtung Ralf Jansen.

          Mfg Myst

          Comment


          • #6
            An deiner Idee hatte mich ein wenig die Komplexität (es soll ein OS-Projekt für Anfänger werden) abgeschreckt und dass der Aufruf der Add\Delete etc. in einer Exception (oder in gar nicht - je nachdem was man implementiert) endet. Das fände ich für Anfänger ein wenig verwirrend.

            Stimmt. Macht die ReadOnlyCollection aber auch so. Da alle Collections IList implementieren müssen sie gezwungener Weise auch die Methoden zur Manipulation in IList mit veröffentlichen müssen.

            Comment

            Working...
            X