Mal wieder: Mehrdimensionales Array dynamisch

chmee

verstaubtes inventar
Premium-User
Da schreib ich nun, hab mehrere Links durchforstet - und weiß, dass ich im Endeffekt hier die besten Antworten bekomme.

Gegeben ist ein Algorithmus, der mir mehrere Int-Listen in Laufzeit erstellt, nicht nacheinander, sondern die Listen werden quer gefüllt. Mal wird dem ersten Array eine Zahl hinzugefügt, dann dem 4., just wieder eine neue leere Liste erstellt, dann wieder mal dem 2. etc.pp. Am Ende habe ich ein zweidimensionales Array mit zB 8 Listen von verschiedener Länge.

So einfach es ist, in php, ein Array dynamisch aufzufüllen, so schwer gestaltet sich die Sache jetzt unter c# - für mich.. Mit vielrumkopieren und wieder in Listen packen, danach für die Ausgabe wieder entpacken ist mir nicht geholfen - eine statische Liste/Array hilft auch nicht, da ich keine Ahnung habe, ob es 8 oder 64 Listen sein werden, dynamisch eben.

Ich hab mir das Konzept von Listen in Listen (list<list<int>>) angeschaut, doch wie es ausschaut, muß ich erst die innere Liste fertigstellen, bevor ich sie in die äußere packen kann.

Nun denn, langer Rede kurzer Sinn, so sehen die Daten zB aus:
Code:
Cluster[0]=(0,3,7,9,12,34,36)
Cluster[1]=(2,10,11,13)
Cluster[2]=(17,18,19,20,21,22,23,24,25)
Cluster[3]=(8,14,15,16,54,55,56)
Und so sieht der Befehl aus, den ich grad aus JS umsetzen will:
Code:
Cluster[ C].push[i];

Wie mach sowas nun ohne Riesenrattenschwanz unter .net/c#?

mfg chmee
 
Zuletzt bearbeitet:
eine statische Liste/Array hilft auch nicht, da ich keine Ahnung habe, ob es 8 oder 64 Listen sein werden, dynamisch eben.

Das spielt doch bei Listen keine Rolle. Mit Listen kannst du in c# im Prinzip genauso werkeln wie in php mit arrays.
C#:
List<List<int>> fooBar = new List<List<int>>();

            /* beliebige Anzahl an Listen hinzufügen */
            Random rnd = new Random();
            int listCount = rnd.Next(0, 64);

            for (int i = 0; i < listCount; i++)
            {
                fooBar.Add(new List<int>());
            }

            /* Verschiedenen Listen neue Elemente hinzufügen */
            
            for (int i = 0; i < 100; i++)
            {
                int listIndex = rnd.Next(0, fooBar.Count);
                fooBar[listIndex].Add(rnd.Next());
            }

Du kannst aber auch die push Methode für "standard" Arrays implementieren.
Beispielsweise so:
C#:
public static class ArrayExtensions
    {
        public static T[] Push<T>(this T[] array, T val)
        {
            T[] temp = new T[array.Length + 1];

            array.CopyTo(temp, 0);
            temp[temp.Length - 1] = val;

            return temp;
        }
    }
C#:
int[] bla = new int[] { 0, 1 };
bla = bla.Push(2);
 
Ich hab mir das Konzept von Listen in Listen (list<list<int>>) angeschaut, doch wie es ausschaut, muß ich erst die innere Liste fertigstellen, bevor ich sie in die äußere packen kann.
Nein. Instanzen von List-Klassen kann man weder als "fertig" noch als "unfertig" bezeichnen. Du kannst zu jeder Zeit Items hinzufügen oder entfernen (außer die Instanz ist Readonly). Du kannst also problemlos Folgendes machen:
C#:
List<List<int>> masterliste = new List<List<int>>();
List<int> subliste1 = new List<int>();
subliste1.Add(123);
masterliste.Add(subliste);
subliste1.Add(456);
List<int> subliste2 = new List<int>();
masterliste.Add(subliste);
subliste1.Add(789);
subliste2.Add(42);
// oder auch wieder eine Subliste entfernen
masterliste.Remove(subliste1);
// oder nur den Inhalt einer Subliste entfernen
subliste2.Clear();
// usw.
 
Zuletzt bearbeitet:
Danke Euch Beiden - Tatsächlich ist es so, dass ich in blindem Eifer so gecodet habe, wie Ihr es beschreibt. Es funktionierte nicht, immer wieder eine Exception wegen falschem Index.. Als ob es die "Listenstelle" zB 3 noch nicht gab. Andere Seiten haben immer wieder lediglich das von mir genannte Beispiel genannt (innere Liste, dann äußere), wodurch ich dachte, es ginge nicht. Nachdem ich hier den ersten Eintrag gelesen hab, einfach genauer hingeschaut und siehe da, der Fehler war, dass ich die Initialisierung der inneren Liste zweimal gemacht habe - vor dem Funktionsaufruf und innerhalb der Funktion.

Kurz und Bündig. ich danke Euch vielmals - Vor Allem hat die Welt ein weiteres Beispiel für mehrdimensionale Listen bekommen (und von mir ein Sorry, es war spät und ich war nicht mehr ganz dabei, scheinbar..)

mfg chmee
 
Zurück