Autor Beitrag
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mo 15.08.16 14:03 
Hallo,

sorry für den schlechten Titel, mir fällt gerade nix besseres ein...

Wenn ich solche Klassendefinitionen habe:

ausblenden C#-Quelltext
1:
2:
3:
4:
  class foo
  {
      private List<KeyValuePair<string, List<Bar>>> test;
  }


und ich die Felddefinition für test jetzt mehrfach brauche, definiere ich dann vorher eine entsprechende Klasse/Typ mit einem Einzeiler? WEnn ja, kommt diese dann in eine eigene Datei? Oder kann man solche Einzeiler ohne weitere Logik auch in einer Datei im Projekt zusammen fassen?

Grüße

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 15.08.16 14:11 
Tach,

bitte was?

Sorry aber ich verstehe deine Frage nicht :nixweiss:

Was mir aber auffällt ist:
1. List<KeyValuePair<string, List<Bar>>> kann in den meisten Fällen durch Dictionary<string, List<Bar>> ersetzt werden.
2. Mehrere Felder in einer Klasse mit dem gleichen Namen geht nicht. Falls du mehrere Klassen haben möchtest, die jeweils ein Feld mit dem selben Namen haben, frage ich mich: warum?

Grundsätzlich sind Dateien vom Code unabhängig. Du könntest auch einen ganzen Namespace in eine Datei hauen und da dann 200000 Klassen drin haben. Theoretisch wäre das egal.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20395
Erhaltene Danke: 2212

Win 10
C# (VS 2017)
BeitragVerfasst: Mo 15.08.16 15:17 
Hallo,

wenn Du einfach nur die Tipparbeit sparen willst, kannst Du so etwas in Deine using-Klausel schreiben:
ausblenden C#-Quelltext
1:
using MyList = System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, System.Collections.Generic.List<Bar>>>;					

Danach sähe die Deklaration dann so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
class foo
  {
      private MyList test;
  }



user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
List<KeyValuePair<string, List<Bar>>> kann in den meisten Fällen durch Dictionary<string, List<Bar>> ersetzt werden.
Der große Unterschied ist natürlich, dass bei der Variante mit dem Dictionary jeder Schlüssel nur höchstens einmal vorkommen kann, während bei der Liste der Schlüssel mehrmals vorkommen kann.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1196
Erhaltene Danke: 158

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mo 15.08.16 15:45 
Und was die Frage angeht ob jeder Typ in eine Datei sollte:

Ist Geschmackssache.
Es wurde ja schon gesagt, dass das geht und Manche würden solche Typen auf in einer Datei zusammen fassen, aber ich persönlich würde das nicht tun.
Ich lege sogar für einen Delegaten, der ja nur eine Zeile ist, eine eigene Datei an, damit ich in der Projektmappe in Form von Ordnern und Dateien den kompletten Inhalt jedes Namespaces dargestellt habe.
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mo 15.08.16 16:40 
Danke für die Tipps und nochmal sorry für die hektische Frage.. Meine Kids standen neben mir und hüpften von einem Bein aufs andere, weil sie ins Freibad wollten... :-)


Es geht um die Definition von Typen und wo die rein sollen. Also die Antworten habt ihr ja schon gegeben. Ich brauch den Klassentyp halt mehrfach, auch in unterschiedlichen Dateien / Klassen, daher die Frage ob man das jetzt mehrfach tippt oder einfach die Definition in einer eigenen Datei macht. Über den Namespace sind diese ja einfach zugreifbar....

Danke für den Hinweis auf Dictionary, hätte mir auch selbst einfallen können ;-) Und ja, der Schlüssel darf da nur einmal vorkommen....
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1196
Erhaltene Danke: 158

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mo 15.08.16 17:51 
Eventuell bietet es sich auch an, eine eigene Klasse zu schreiben, die nicht von sowas wie z.B. List oder Dictionary ableitet, es aber intern nutzt.

Ein Beispiel:
Ich brauchte mal eine Klasse, die die Properties eines Typs und ein paar Informationen zu jeder Property bereit hält.
Da bietet es sich natürlich an, ein Dictionary zu nehmen, das als Key den Namen oder die PropertyInfo und als Value die zusätzlichen Informationen bereit hält.
Allerdings habe ich eben dieses Dictionary dann nur als privates Feld in der Klasse gehabt und über ein paar Methoden (z.B. GetPropertyMetadata) die Inhalte zur Verfügung gestellt.

Je nach Bedarf kannst Du dann ja noch die Interfaces (z.B. IList oder IDictionary) implementieren. Wenn Du sie implementiert haben willst, das "optisch" aber nicht zur Klasse passt, kannst Du die Member ja auch explizit implementieren.

Das ist zwar aufwendiger, allerdings habe ich bei der Klasse dann komplett freie Hand und bin nicht an das Dictionary gebunden.
So kann ich dann auch das Verhalten nachträglich ergänzen und es greift überall.


Als weiteren Gedanken kann es auch sinnvoll sein, das was ich oben geschrieben habe, auf Interface-Ebene zu betreiben.
Du schreibst dann ein Interface (z.B. IPropertyManager) mit den benötigten Methoden (z.B. GetPropertyMetadata) arbeitest dann mit dem Interface und kannst die Implementierung bei Bedarf austauschen.




Das solltest Du aber nur tun, wenn die Daten der Klasse gleichwertig sind, die Anwendungsfälle ähnlich sind.
Sonst wird der Vorteil ganz schnell zum Nachteil.
Wenn die Inhalte der verschiedenen Dictionaries in den verschiedenen Klassen aber thematisch unterschiedlich sind oder sogar garnicht zueinander passen, dann solltest Du das auf jeden Fall bleiben lassen und nicht versuchen, die zugegeben lange Schreibweise irgendwo zusammen zu fassen.
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mo 15.08.16 21:20 
Danke das ist bekannt.
Mit Interfaces habe ich in c# noch nichts gemacht, zudem reicht mir hier wirklich ein einfaches Dictionary - oder besser gesagt eine schnelle HashMap - wenn es da was schnelleres als Dictionary gibt wäre ich um weitere Tipps dankbar!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1196
Erhaltene Danke: 158

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mo 15.08.16 21:22 
Dictionary und HashMap ist was anderes. Das eine hat Key-Value-Pairs mit eindeutigem Key und das andere eindeutige Items.
Beide arbeiten mit dem HashCode und bei Beiden solltest Du dir um Performance keine Sorgen machen :D
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 789
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Di 16.08.16 07:02 
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Dictionary und HashMap ist was anderes. Das eine hat Key-Value-Pairs mit eindeutigem Key und das andere eindeutige Items.
Beide arbeiten mit dem HashCode und bei Beiden solltest Du dir um Performance keine Sorgen machen :D


letzlich ist es (mir) egal: Es geht um das schnelle suchen.. Und ob ich mir um die Performance Gedanken machen muss - wenn ich dran denke werde ich berichten :-)