[C#] Dictionary

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[C#] Dictionary

Beitrag von BeRsErKeR »

Mal eine ganz dumme Frage. Kann man in C# über den Index-Operator beispielsweise eines Dictionaries direkt Member des Value-Objekts ändern?

Beispiel:

Code: Alles auswählen

Dictionary<int, Point> foo = new Dictionary<int, Point>();
foo.Add(0, new Point(10, 10));

foo[0].X = 5;
Also ich bekomme hier (letzte Zeile) vom Compiler eins auf den Deckel.

Der Rückgabewert "System.Collections.Generic.Dictionary<int,System.Drawing.Point>.this[int]" kann nicht geändert werden, da er keine Variable ist.

Soweit so unschön. Nun die Frage ob man das irgendwie schön lösen kann.

Prinzipiell ist ja folgendes möglich:

Code: Alles auswählen

foo[0] = new Point(5, foo[0].Y);
Nur möchte ich nicht immer ein neues Objekt erstellen. Dachte das kann man vielleicht irgendwie eleganter lösen.
Ohne Input kein Output.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [C#] Dictionary

Beitrag von Artificial Mind »

Nein das geht nicht anders.
In C# sollte man deswegen bei Value Types sehr vorsichtig sein.

Nachtrag: und komm nicht auf die Idee ein eigenen Point-Struct zu schreiben, das eine Setter-Methode oder Property hat, denn das zurückgegebene Objekt ist eine Kopie, kein Original. Bin ich vorgestern erst drauf reingefallen ;)
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C#] Dictionary

Beitrag von dot »

Nein das geht leider nicht. Das geht afaik nur bei Arrays. Du könntest einen Setter schreiben, dann gehts evtl., bin mir aber nicht ganz sicher, is schon länger her...

EDIT: Ok, nachdem der Indexer ja nur ein Value zurückgibt, wird das wohl auch net helfen...
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [C#] Dictionary

Beitrag von Artificial Mind »

dot hat geschrieben:Nein das geht leider nicht. Das geht afaik nur bei Arrays. Du könntest einen Setter schreiben, dann gehts evtl., bin mir aber nicht ganz sicher, is schon länger her...

EDIT: Ok, nachdem der Indexer ja nur ein Value zurückgibt, wird das wohl auch net helfen...
Das ist das was in meinem Nachtrag drinsteht, es geht definitiv nicht mit einem Setter ;)

Ich hatte das für die Vertex-structs gemacht, um die Daten zu setzen und sicherlich 2 Stunden mit Debuggen verbracht, wieso meine Vertices nicht gezeichnet werden ;)
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C#] Dictionary

Beitrag von dot »

Für Vertices würd ich zu Arrays raten ;)
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [C#] Dictionary

Beitrag von Artificial Mind »

Aber nicht in der Generierungs-Phase, wenn ich die Anzahl noch nicht kenne.

EDIT: ja, hängt halt stark von der Architektur ab - und ich mag List sehr viel lieber als arrays :)
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C#] Dictionary

Beitrag von dot »

Ich auch, aber bei List hast du wieder das gleiche Problem wie mit dem Dictionary ;)
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [C#] Dictionary

Beitrag von BeRsErKeR »

Das ist aber ziemlich unschön wenn man ziemlich große Objekte in einem Dictionary oder anderen Container verwaltet und beispielsweise nur einen Member ändern will. Da jedes mal ein neues Objekt anzulegen kann doch nicht die Lösung sein.
Ohne Input kein Output.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [C#] Dictionary

Beitrag von Artificial Mind »

Man sollte keine "ziemlich großen" Value-Type-Objekte haben. Dafür gibt es Klassen in C#.
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C#] Dictionary

Beitrag von dot »

BeRsErKeR hat geschrieben:Das ist aber ziemlich unschön wenn man ziemlich große Objekte in einem Dictionary oder anderen Container verwaltet und beispielsweise nur einen Member ändern will.
Ich vermute mal, du verwendest das Dictionary eh nur als Hashtable beim Einlesen der Vertices um ein indiziertes Mesh aufzubauen!?
Wobei ich mich dann frag, in welchem Zusammenhang du da überhaupt auf dieses Problem stoßt...
BeRsErKeR hat geschrieben:Da jedes mal ein neues Objekt anzulegen kann doch nicht die Lösung sein.
Wenn du eine bessere Lösung findest, dann sags mir. Das Problem hatt ich auch schon ;)
Die Frage ist ob der C# Compiler evtl. fähig ist, entsprechend zu optimieren, sodass z.B. ein

Code: Alles auswählen

bla[i] = new blub(10, bla[i].y);
zu einem

Code: Alles auswählen

bla[i].x = 10;
wird. Ich habs nicht ausprobiert.
Generell würd heute wohl direkt den OpenGL Renderer von dem entsprechenden C# Projekt, um das es da damals ging, in C++/CLI schreiben, statt einen .NET Wrapper um OpenGL zu basteln. Wrapper sind eben wirklich nie eine gute Idee ;)
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [C#] Dictionary

Beitrag von BeRsErKeR »

Ne das ganze dreht sich nicht um Meshes. Ich bastle mir einen Map-Editor für ein 2D-Jump'n'Run in der Art von Sonic, bei dem die Maps halt nicht nur aus Tiles, sondern aus geometrischen 2D Objekten, wie Rampen, Loopings, usw bestehen. C# deshalb, weil man einfacher und schneller ein vernünftiges GUI hinbekommt. Das eigentliche Spiel wird dann in C++ geschrieben.

Geometrische Objekte sind halt über eine Liste von Punkten repräsentiert. Im Eigenschaften-Fenster solche Objekte möchte ich halt z.B. die x-Komponente eines Punktes ändern. Dabei trat das Problem auf.

Einem Punkt könnte man aber halt noch weitere Daten mitgeben, wie Farbe, Textur usw. Irgendwann wird die Struktur halt etwas größer. Und da würde ich das schon recht unschön finden. Wobei es im Map-Editor wahrscheinlich nicht so sehr ins Gewicht fallen wird.
Ohne Input kein Output.
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C#] Dictionary

Beitrag von dot »

Ok, dann versteh ich aber nicht wofür das Dictionary. Wäre eine List nicht viel effizienter?
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [C#] Dictionary

Beitrag von Artificial Mind »

Und benutzt am besten Klassen für sowas. C# ist darauf optimiert, große Mengen von Objekten zu erstellen, da hat man nicht jedesmal den system calls overhead von einem C++-new. Da kannst du dann deine Punkte vernünftig reinpacken, du kannst sogar Properties benutzen um mit einem PropertyGrid bequem alles editieren zu können, hast Vererbung usw. usf.
Meiner Erfahrung nach gibt es wenig Situationen wo man wirklich eigene Value Types haben möchte.
Benutzeravatar
Schrompf
Moderator
Beiträge: 5162
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [C#] Dictionary

Beitrag von Schrompf »

... bis das erste Mal der Garbage Collector zuschlägt und durch Millionen an Kleinstobjekten waten muss :)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: [C#] Dictionary

Beitrag von Artificial Mind »

Schrompf hat geschrieben:... bis das erste Mal der Garbage Collector zuschlägt und durch Millionen an Kleinstobjekten waten muss :)
Ist dir da schon wirklich mal die Performance dran kaputtgegangen? Mir noch nie und ich habe häufiger _sehr_ viele Objekte erstellt (halt 2-3 GB Ram mit kleinen Objekten voll).
Meine Erfahrungen:
C# GC hat damit kein Problem, der hat ne gute Generationenverwaltung und kriegt auch echt viele Objekte gut gemanaged und beeinflusst nicht/kaum die anderen Threads.
Java/Sun GC friert das Programm bisweilen einige Sekunden lang ein.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [C#] Dictionary

Beitrag von BeRsErKeR »

dot hat geschrieben:Ok, dann versteh ich aber nicht wofür das Dictionary. Wäre eine List nicht viel effizienter?
Das Dictionary nutze ich eigentlich für eine Liste aus Polygonen. Für die Punkte verwende ich eine Liste, aber hab für das Beispiel nun Punkte genommen, zur Vereinfachung. Das Dictionary für Polygone brauche ich, weil ich sie über eine ID referenzieren will (im Editor kann man dann besser die Polygone unterscheiden) und muss sich nicht durch die Liste hangeln.
Ohne Input kein Output.
Antworten