C# Nested Collection

ML89

Lt. Junior Grade
Registriert
Apr. 2014
Beiträge
440
Hallo,

ich versuche eine nested (geschachtelte) Collection-Klasse zu schreiben.
Mein Ziel wäre folgendes:

Code:
Collection[0].SubCollection[1].Property

Wie ich eine einzelne Klasse basierend auf der CollectionBase erstelle, ist mir bekannt, nur wie hier in dem Fall die SubCollection darstelle nicht. Kann mir jemand von euch einen Tip geben?
 
Code:
new List<List<string>>();
Oder steh ich aufm Schlauch?
 
Nein, das geht.

Bisher kann ich so zugreifen:

Code:
List<List<string>> list = new List<List<string>>();
List<string> sublist = new List<string>();
sublist.Add("Ein bisschen Text");

Und dann:

Code:
 Console.WriteLine(list[0][0]);

Nur mir fehlt noch diese hübsche Sache mit der SubCollection, aber das kriege ich noch hin
 
Welche hübsche Sache mit der Subcollection? Du kannst doch mithilfe von list[X] auf die Subliste zurückgreifen?
 
Du natuerlich auch die sublist der list hinzufuegen.
Code:
list.Add(sublist);
 
Also ich habe das Problem an folgender Stelle:

Im C#-Handbuch von Microsoft heißt es so schön:

Code:
using System;
using System.Collections;

public class Collection : CollectionBase´
{
      public string this[ int index ]
      {
           get  { return( (string) List[index] ); }
           set  { List[index] = value; }
      }

      public int Add( Int16 value )
      {
      return( List.Add( value ) );
      }
}


Entscheidend scheint für mich diese Zeile zu sein:

Code:
public string this[ int index ]

Sie ermöglich mir Folgendes:

Code:
string Text = collection[0]

Sprich meine Collection collection nimmt dann den Wert der List an der der Stelle[0] an.
Bei meiner

Code:
Collection[0].SubCollection[1].Property

nimmt aber die Poperty SubCollection den an Collection[0] gewählten Wert an (Oder irre ich da?).
Letztendlich ,öchte ich es quasie wie bei der ListView machen:

Code:
ListView.Items[0].SubItems[1].Text
 
ML89 schrieb:
Bei meiner

Code:
Collection[0].SubCollection[1].Property

nimmt aber die Poperty SubCollection den an Collection[0] gewählten Wert an (Oder irre ich da?).
Letztendlich ,öchte ich es quasie wie bei der ListView machen:

Code:
ListView.Items[0].SubItems[1].Text

Ich verstehe den Unterschied hier nicht. Was willst du denn da anders machen? Ist doch exakt das Gleiche?!
 
Du solltest dir das Konzept von Objekten nochmal zu Gemüte führen.

Code:
ListView.Items
List der Items
Code:
[CODE]
ListView.Items[0]
Das erste Item

Code:
ListView.Items[0].SubItems
So muesste das Item in der Liste eine Property haben, welche Subitems heißt. Nach den eckigen Klammern greifst du nicht mehr auf das "Collection" Object zu sondern auf das Element in der Liste
 
Ach jetzt raff ich es. Er will nicht

Code:
list[0][0]

sondern

Code:
list[0].sublist[0]

machen.

Wozu das Ganze?!

Das lohnt sich nur, wenn dein Objekt der Ebene 1 auch noch andere Properties hat.
 
Genau.

Ich habe eine Tabelle mit Spalten. Die möchte ich in so einer Collection nach Spalten sortiert ausgeben:

Code:
Collection collection = listView1.Sortieren(1,2) //Die Angabe 1,2 gibt dabei di Spalten an.

Weiterhin möchte ich dann so darauf zurückgreifen:
Code:
string text = collection[0].SubItems[0].Text //collection[0] entspricht dabei der Spalte 1, SubItems[0] dem SubItem in der 0ten Zeile
 
Ist das eine Interne Methode oder musst du die Daten an irgendeiner Stelle nach "außen darstellen".

Der Korrekte Weg wäre hier wohl mehrere Klassen zu erstellen (Table, Column).

Dein Objekt Tabelle bekommt dann das Property Columns, welche eine List<Column> bspw. ist. Zusätzlich evtl. noch einen Namen, oder was weiß ich...

Das lohnt sich aber nur, wenn:
1. deine Tabelle mehr Eigenschaften als deren Spalten besitzt
oder
2. du eine externe Darstellung brauchst bzw. diese Objekte noch anderweitig gebraucht werden

In einer simplen Methode würde ich es einfach bei List<List<x>> belassen.

Wonach die Spalten allerdings sortiert werden, ist hier nicht ersichtlich. I.d.R. brauchst du dafür auch keine neuen Objekte, denn es ändert sich ja auch nur die Reihenfolge.
 
Zuletzt bearbeitet:
Hallo,

ich habe das jetzt mit einer

Code:
List<List<SubItem>

gemacht, funktioniert auch soweit.

Diese geschachtelte Liste ist Teil einer statischen Klasse, d.H:

Code:
MyClass.Items[0][0].Text

Wenn ich diese statische Klasse MyClass in einer neuen Form benutzen möchte, muss ich sie erst durch einen Zugriff "initialisieren". Woher kommt das?

Aufbau der MyClass:

Code:
public static class MyClass
{
      private static List<List<SubItem>> list;
      
      static MyClass()
      {
             list = new  List<List<SubItem>>
      }

      public static  List<List<SubItem>> SubItems
      {
            get { return list; }
      }
}

Aber die sollte doch im selben namespace doch bereits "initialisert sein oder?"
 
Klassen- und Instanzvariablen werden automatisch initialisiert, und zwar mit null (ausgenommen primitive Typen). Wenn du die variable mit List<List<SubItem>> initialisieren willst, musst du das auch so schreiben. Das geht auch direkt bei der Deklaration.

Warum denn static?
 
Zurück
Oben