Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.08.2014, 16:46

C# Elemente von unendlichen Nested Collections abrufen?

Hi,

ich hätte da eine Frage bezüglich verschachtelten Auflistungsklassen.

Gibt es einen Algorithmus, der alle verschachtelten Auflistungsklassen solange durchläuft, bis er alle Elemente in den ganzen verschachtelten Klassen gefunden hat:

Beispiel:

C#-Quelltext

1
2
3
List<List<List<List<int>>>> nestedList = new List<List<List<List<int>>>> () {new List<List<List<List<int>>>>() {0,1,2,3,4,5,6,7,8,9,10};

// Algortihmus, der mir alle Zahlen von 0 - 10 der letzten List sucht.


Und auch seien es unendlich viele verschachtelte Collections, es sollte so sein, das er mir alle Elemente in den verschachtelten Klassen sucht, bis er alle gefunden hat.

Ich wäre euch über Tipps und hilfreiche Antworten sehr dankbar :)

Mfg

JungleProgger

P.s Und bitte keine Sinnesdisskussion, wenn ihr es nicht wisst, dann bitte einfach nichts schreiben, nur nicht über den Sinn von sowas reden^^ (nicht böse gemeint)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »JungleProgger« (08.08.2014, 16:59)


AntroX-Arthas

Frischling

Beiträge: 6

Beruf: Tischler

  • Private Nachricht senden

2

08.08.2014, 17:00

Du kannst Listen schreiben die sich automatisch vergrößern um mehr Daten aufzunehmen und mehrere dann mit einer For Schleife etc durchlaufen aber bedenke dabei das es Rechenzeit kostet die drastisch steigt. zb:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
list<CNummer1>::iterator It1 = m_Nummer1List.begin ();
list<CNummer2>::iterator It2 = m_Nummer2List.begin ();

for (It1 = m_Nummer1List->begin (); It1 != m_Nummer1List->end ();   ++It1)
{

         for (It2 = m_Nummer2List->begin ();    It2 != m_Nummer2List->end ();   ++It2)
         {
         //Zuerst springt er hierhin und testet die erste Möglichkeit von Nummer1 mit allen inhalten von Nummer2
         }

//Dann zählt er hier Nummer1 um einen höher und führt wieder die innere Schleife mit allen möglichkeiten aus

}


Wenn du weiter und weiter verschachtelst, dann geht das mächtig in die Leistung. Solltest du das ganze in ein Spiel einbauen wollen und diese Abfrage öfter auftauchen, dann wird es an der Stelle hängen.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

3

08.08.2014, 17:02

P.s Und bitte keine Sinnesdisskussion, wenn ihr es nicht wisst, dann bitte einfach nichts schreiben, nur nicht über den Sinn von sowas reden^^ (nicht böse gemeint)


Denn Sinn zu kennen ist aber unerlässlich um konstruktiv eine Lösung vorschlagen zu können...

Du hast nämlich erst ein mal ein zugrunde liegendes Problem, dass du lösen möchtest und bist dann auf den Weg mit zigfach verschachtelten Listen gekommen.
Ich bezweifel aber einfach mal, dass das der richtige Weg ist und deshalb frage ich trotzdem: Warum hast du überhaupt so tief verschachtelte Listen? Was ist das Problem, dass du mit dieser Konstruktion lösen willst?

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

4

08.08.2014, 17:05

Also das schreit ja geradezu nach Rekursion. Ist ja vom Prinzip ein Graph, in dessen Wurzel und Knoten die List<T> sind, deren jeweilige Kinder wieder List<T> sind und in den Blättern am Ende jeweils List<int> hängen.
Was möchtest du in dem Algorithmus denn zurückgeben? Alle Integers in allen Blättern (die jeweils letzte List<int>), oder nur eine davon/die erste/die letzte?

Versuch's doch mal in etwa so (nicht komplett durchdacht, nur Pseudocode... ich geb einfach mal alle Integers aus, die irgendwo in den Blättern hängen):


C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
List<int> GetAllIntegersInTree(object inputList) {
  List<int> returnList = new List<int>();

  if (objInputList.GetType() == typeof(List<int>)) {
    returnList.AddRange((List<int>)inputList);
  } else {
    foreach (object childList in inputList) {
      returnList.AddRange(GetAllIntegersInTree(childList));
    }
  }

  return returnList;
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »LInsoDeTeh« (08.08.2014, 17:19)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

08.08.2014, 17:50

Ich denke auch das ist eine Form eines Baumes und da ist Rekursitivität meiner Meinung nach das erste Stichwort. Und ja, man kann auch einfach über Dinge sprechen ohne zu gucken ob es sinnvoll ist, zum Beispiel einfach aus reinem Interesse, aber auch für mich sieht das nach Quatsch aus. Zu tief verschachtelte Listen sind doch sehr merkwürdig und unübersichtlich. Da sollte man sich überlegen ob es nicht schon sinnvollere Datenstrukturen gibt die einen zum Ziel führen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige