Laden...

List<List<T>> ?

Letzter Beitrag vor 18 Jahren 19 Posts 3.402 Views
List<List<T>> ?

Hi.

habe folgendes problem:
Ich möchte eine Liste erstellen, die Listen enthält.


List<??> blubb = new List<??>();
blubb.Add(new List<Channel>());

geht das überhaupt? oder muss ich umschwenken?

Ich kenne zwar List bisher garnicht, aber ich schätze mal, dass in der List Objekte vom Typ object abgelegt werden. Falls dies der Fall ist, sollte es gehen.

==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================

List<List<Channel>> mylist = new List<List<Channel>>();

Hallo!

@Maddinel: Nein, das íst nicht so. List<T> ist eine generische Listenimplementierung. Der Vorteil der Generics (neu in .Net2.0) ist gerade der, das casten in object zu vermeiden.

@sebo: Habe es noch nicht ausprobiert, aber wenn es geht, dann so:

List<List<Channel>> test = new List<List<Channel>>();

der Marcel

EDIT: zu spät 🙂

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

Original von Noodles

List<List<Channel>> mylist = new List<List<Channel>>();  

so hab ich das auch gedacht und auch probiert:

The type or namespace name 'Channel' could not be found (are you missing a using directive or an assembly reference?)

klappt also leider nicht.

dies wiederum scheint zu funktionieren:


List<Object> groups = new List<Object>();
groups.Add(new List<RssChannel>());

sollte es tatsächlich klappen (bisher fehlerlose compilierung möglich), bedanke ich mich schon mal 😉

Das klappt. Du musst halt nur den Namespace von Channel einbinden.

Hallo sebo!

Das liegt aber nicht an der Liste, sondern dass an dieser Stelle in deinem Code der Typ Channel nicht bekannt ist!

der Marcel

EDIT: schon wieder 😁

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

wie binde ich denn den namespace ein? ^^

Hi sebo!

Ist denn Channel eine Klasse von dir oder aus einer Framework-Bibliothek.
Namespaceeinbinden geht über Projektverweis und using-Direktive.

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

channel ist eine von mir geschriebene Klasse.
mit deinen tips kann ich leider nur wenig anfangen 😉

Hi!

Wo steht denn diese Klasse? auf jeden Fall in einem anderen namespace.
Das ist aber das normale Vorgehen: Assembly referenzieren und namespace evtl. per using einbinden (schau mal im VS --> dein Projekt --> Verweise nach, kannst du mit Menü Projekt --> Verweis hinzufügen hinzufügen, für ein beispiel der using-Direktive: das VS fügt einige usings automatisch am Dateianfang ein)

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

nein. die sind alle im gleichen namespace. (grad nachgeschaut)
eine andere klasse ist in einem anderen paket
Freeder.Rss --> Freeder.Gui

in der Gui habe ich den namespace Rss via using eingebunden. da hats natürlich ohne nicht geklappt.

Hi sebo!

The type or namespace name 'Channel' could not be found (are you missing a using directive or an assembly reference?)

Die fehlermeldung sagt aber was anderes. Der namespace von Channel (evtl. Schreibfehler? Groß/Klein?)ist nicht greifbar.


List<Object> groups = new List<Object>();
groups.Add(new List<RssChannel>());

Damit machst du den Vorteil von Generics kaputt. Der ist eben, gerade nicht in object zu casten! 😉

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

nein wie blöd... hab das nu offensichtlich in allen versuchen falsch gemacht.
Das ding heisst RssChannel und nicht Channel ...

damit wäre das geklärt.
wenn du mir jetzt noch sagst, warum das so ein vorteil ist, nicht in object casten zu müssen, bin ich dir richtig dankbar (nicht, dass ich es nicht so auch schon wäre...)

Der Vorteil an Generics ist die Typ-Sicherheit. D.h. du kannst in deinem Fall nur RssChannel-Objekte in die Liste aufnehmen. Es kann also nicht versehentlich z.B. ein string in der Liste enthalten sein.

mfg

Es ist nicht nur der Typsicherheit wegen.

Mach mal ein paar Geschwindigkeits test, wirst Dich wundern.

Hab ich vor einigen Wochen schonmal gemacht, echt erstaunlich was das bringt 😉

Ich habe die Geschwindigkeit nicht erwähnt, weil m.E. die Typ-Sicherheit das wichtigste daran ist.

mfg

Original von FZelle
Es ist nicht nur der Typsicherheit wegen.

Mach mal ein paar Geschwindigkeits test, wirst Dich wundern.

Das wundert mich ein wenig und bringt mich auf die Frage: Wie funktionieren die Generics in C# denn intern?
In Java ist es so, dass Generics im Bytecode nicht mehr existieren. Der Compiler überprüft das also, aber später wird dann doch wieder gecastet. Der Vorteil davon ist, so heißt es immer, dass nicht immer neue Klassen erstellt werden (wie bei C++ templates) und das Programm dadurch klein gehalten wird. Der Nachteil ist eben, dass die Geschwindigkeit nicht steigt (wenn auch nicht sinkt) (und so Sachen wie dass es keine Generic Arrays gibt).

Lange Rede, kurzer Sinn: In C# muss das ja anders sein. Hätte jemand einen Link parat, in dem das beschrieben wird? (Oder erklärt es mir vielleicht sogar jemand von euch 🙂 )

Wir leben zwar alle unter demselben Himmel, haben aber deswegen lange noch nicht alle denselben Horizont.

Hallo zusammen,

kann einer von euch bitte einen Geschwindigkeitsvergleich oder zumindest konkretere Aussagen posten? Mir ist noch nicht klar, welches Wunder mir bisher verborgen geblieben ist. 🙂

herbivore