Laden...

Hilfe bei enum Struktur

Erstellt von -acid- vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.760 Views
-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren
Hilfe bei enum Struktur

Hallo Freunde,

wie stelle ich diese Struktur dar, damit ich später auswählen kann

...Gruppen.Farben.Farbe1

?

Gruppen

  • Gruppe1
    -- Wert1
    -- Wert2
  • Farben
    -- Farbe1
    -- Farbe2

Bisher habe ich gemacht:

public enum Gruppe1 {
  Wert1
  Wert2
}

public enum Farben {
  Farbe1
  Farbe2
}

Ich muss also jetzt nur noch sehen, dass ich Gruppe1 und Farben in eine Hauptgruppe bekomme.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-,


public class Gruppen
{
   public enum Gruppe1 {
     Wert1,
     Wert2
   }

   public enum Farben {
     Farbe1,
     Farbe2
   }
}

herbivore

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

*argh* Anfänger- und Mittwochabendfehler X(

Danke erstmal.

Wenn ich jetzt Gruppen.Farben.Farbe1 aufrufe kommt:
"cannot convert from 'Gruppen.Farben' to 'Gruppen'".

Ich mache wohl noch was beim Aufruf falsch.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-,

wie lautet denn dein Aufruf?

herbivore

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

// Methode
Ausgabe(Gruppen Gruppe)
{
   MBox...Gruppe...
}

// Aufruf (Hier kommt der Fehler)
Ausgabe(Gruppen.Farben.Farbe1);

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-,

obwohl die beiden Enums in einer Klasse gekapselt sind, sind sie doch unabhängig von einander. Deshalb geht das, was du willst nicht.

Auch Casten in z.B. int (enums ja durch ints repräsentiert) nützt hier nichts, weil Gruppen.Farben.Farbe1 und Gruppen.Gruppe1.Wert1 durch dieselbe Zahl repräsentiert werden. Natürlich könnte man dafür sorgen, dass unterschiedliche Zahlen verwendet werden, aber das bleibt dann ein unsichere Konstruktion.

Vielleicht scheibst du noch, was deine Gruppen für konkrete Ausprägungen haben. Vielleicht lässt sich dann eine bessere Lösung finden.

herbivore

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

Dann stelle ich mal das Ziel vor:

Es gibt Gruppen in diesen befinden sich Schlüssel und darin Werte.

Mir muss es möglich sein, per Auswahl die Gruppe mit Schlüssel und Wert aufzurufen um Eingabefehler bei manueller Eingaben zu verhindern.

Also statt

Ausgabe("Farben", "Schlüssel2", "Rot");

möchte ich auswählen können

Ausgabe(Gruppen.Farben, Gruppen,Farben,Schlüssel1,  Gruppen.Farben.Schlüssel1.Rot);

Damit weiß ich
a) welche Gruppe (Parameter 1) ausgewählt wurde
b) welcher Schlüssel (Parameter 2) ausgewählt wurde
c) welchen Wert (Parameter 3) der ausgewählte Schlüssel bekommt.

Um das mal in einer Struktur darzustellen:

Gruppen:

  • Farben
    ---- Schlüssel1
    ------- Yes
    ------- No
    ---- Schlüssel2
    ------- 0
    ------- 1
  • Höhen
    ---- Schlüssel1
    -------- Wert1
    -------- Wert2

Verstanden?

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

Und um nochmals zu ergänzen:

Diese Struktur möchte ich temporär speichern und am Ende des Scriptes in eine Datei speichern.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-,

das klingt mir danach, dass es das beste ist, tatsächlich Strings zu verwenden. Meines Erachtens ist das auf keinen Fall was für Enums.

Du könntest dir eine Baumstruktur (eigene Knoten-Klasse) aufbauen, die die zulässigen Gruppen, Schlüssel und Werte enthält und Benutzereingaben gegen diese prüfen.

herbivore

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

Alles klar. Auch wenn ich mir dachte, dass es funktioniert habe ich es nun über Strings gelöst.

Jetzt nochmal ne Frage: Damit nicht bei jedem Aufruf der Schreibmethode das Textdokument geschrieben wird, wollte ich die Daten in einer internen Tabelle oder ähnlichen zwischenspeichern und erst anschließend alles auf einmal schreiben. Welche Klasse nehme ich dazu am besten um diese Struktur abzubilden bzw. zwischenzuspeichern und am Ende erst mit Write(Var) zu speichern?

Gruppen:

  • Farben
    ---- Schlüssel1
    ------- Yes
    ------- No
    ---- Schlüssel2
    ------- 0
    ------- 1
  • Höhen
    ---- Schlüssel1
    -------- Wert1
    -------- Wert2
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-,

in einer Baumstruktur. Dazu brauchst du eine eigene Knoten-Klasse, denn soweit ich weiß, ist in System.Collections nichts passendes zu finden. Als Vorlage (aber nicht Oberklasse) für deine Knoten-Klasse kannst du TreeNode benutzen.

herbivore

P
939 Beiträge seit 2003
vor 18 Jahren

Original von -acid-
Um das mal in einer Struktur darzustellen:

Gruppen:

  • Farben
    ---- Schlüssel1
    ------- Yes
    ------- No
    ---- Schlüssel2
    ------- 0
    ------- 1
  • Höhen
    ---- Schlüssel1
    -------- Wert1
    -------- Wert

... Welche Klasse nehme ich dazu am besten um diese Struktur abzubilden bzw. ...

Du sagst es doch schon selber, du brauchst Klassen oder Strukturen. Definier' sie doch.

@herbivore, eine allgemeine Baumstruktur ist hier glaube ich nicht das richtige.

Der Code angedeutet:

public class Gruppen {
   public static Farben Farben { get; }
   public static Hoehen Hoehen { get; }
}

public class Farben {
   public YesNo Schluessel1 { get; set; }
   public int Schluessel2 { get; set; }
}

public enum YesNo { Yes, No }

// usw.

// Verwendung.
YesNo val = Gruppen.Farben.Schluessel1;

Wenn neue Optionen hinzugefügt werden können sollen, kann es natürlich nicht so starr programmiert werden. An der Stelle bieten sich typisierte Collections, List<T> oder Dictionary<T,U> an.

public class Gruppen {
   public static Dictionary<string, YesNo> Farben { get; }
   // ...
}

// Verwendung.
YesNo val = Gruppen.Farben["Schluessel1"];

In .Net 2.0 kann man parametrisierbare Collections verwenden, die erleichtern einem vieles. In .Net 1.1 muss für typsichere Collections mehr Aufwand betrieben werden. Geht aber auch, guck dir an wie StringCollection definiert ist.

Gruss
Pulpapex

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Pulpapex,

eine allgemeine Baumstruktur ist hier glaube ich nicht das richtige.

die Baumstruktur, um die es hier geht, sieht mir sehr nach registry-ähnlichen Einstellungen aus. Ich stelle mir vor, für jeden Schlüssel in der Registry gäbe es eine eigene Klasse und für jeden Wert eine Methode. Uiii, da wär aber was los. Daher scheint mir dein Vorschlag auch nicht das richtige 🙂 Vermutlich haben wir mit unseren Vorschlägen das Spektrum aufgespannt, in deren Mitte sich die beste Lösung findet.

herbivore

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

@Pulpapex: Danke erstmal. Leider kann ich das erst heute Abend ausprobieren.

  1. Es sollen keine neuen Optionen hinzugefügt werden können. Allein der Code der Klasse bestimmt die Auswahl.

  2. Sollte das wirklich funktionieren, wie übernehme ich dieses Struktur in eine temporäre Tabelle, damit ich alles auf einmal speichern kann und nicht die Datei immer und immer wieder öffnen muss um zu schreiben...

P
939 Beiträge seit 2003
vor 18 Jahren

In VC# Beta2 gibt es einen Wizard, der einem zugeschnittene Settings-Klassen für Benutzer- und Anwendungseinstellungen generiert. Der Zugriff auf diese Klasse funktioniert genauso wie du es haben möchtest. Also nach dem Schema App.Settings.HintergrundFarbe usw. Die Einstellungen werden in Config-Dateien im XML-Format gespeichert.

Vielleicht guckst du dir den generierten Code dieser Klassen mal an. Ist einfach und durchschaubar. Das Prinzip kannst du dann zum Laden und Speichern deiner Strukturen übernehmen.

Siehe auch: Das neue Konfigurationsmodell im .NET Framework 2.0

Gruss
Pulpapex

2.921 Beiträge seit 2005
vor 18 Jahren

Achtung: zum Tipp, Strings verwenden, enums können in C# tatsächlich in Strings umgewandelt werden, da auch enums objekte in C# sind.

Also z.B. wenn der Enum Farbe heißt:

enum Farbe
{
rot,
gruen,
blau
}

enum mycolor = chosenColor;

dann einfach chosenColor.toString() dahinter, das heißt, dann ergeben sich tatsächlich die Strings "rot", "gruen", "blau", je nachdem was im Objekt steckt. Ok? 😁

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Das geht mit Enum.Parse() sogar umgekehrt.

Zur Speicherung kannst du auch mit Xsd.exe generierte Klasse verwenden. Das läuft auch unter 1.1! Xsd.exe unterstützt auch XML-Schema-Enums und generiert entsprechende Enums im Code.

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

So hab mir nun überlegt, dass ohne Werte zu machen bzw. die Werte nicht auswählbar darzustellen sondern nur manuell einzugeben. Somit entfällt die letzte Ebene und es wären also in den Gruppen immer nur EINE Unterebene. Würde das die Sache vereinfachen?

  • Farben
    ---- Schlüssel1
    ---- Schlüssel2
  • Höhen
    ---- Schlüssel1
    ---- Schlüssel2

Ziel:

[Farben]
Schlüssel1 = Manueller Wert
Schlüssel2 = Manueller Wert

[Höhen]
Schlüssel1 = Manueller Wert
Schlüssel2 = Manueller Wert

Mein bisheriger Code (funktioniert):

public enum Gruppen {
  Farben,
  Hoehen
}

public enum Farben {
 Schluessel1
 Schluessel2
}

public enum Hoehen {
 Schluessel1
 Schluessel2
}

Aufruf:

Ausgabe(Gruppen.Farben, Farben.Schluessel1, "Wert")

Probleme:
a) Ich würde gerne schreiben können:

Ausgabe(Gruppen.Farben, Gruppen.Farben.Schluessel1, "Wert")

b) Das in eine temporäre Tabelle speichern.

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

Warum kann ich denn Höhen und Farben nicht einfach in ne Klasse schreiben und dann mit Klassenname.Farben.Schlüssel aufrufen? 8o


!!!!!!!!!!EDIT!!!!!!!!!!
HAH! Ich habs! Habe mal alles in eine Datei geschrieben siehe da es geht.

Das Problem liegt also in der Methode Ausgabe am Typ "Keys". Dieser ist ja nicht Keys sondern Farben oder Höhen! Sprich der Typ müsste dynamisch sein...

public void Ausgabe(Sections Section, Keys Key, string Value)

So jetzt könnte ich schreiben:

public void Ausgabe_Farben(Sections Section, Farben Key, string Value)

und

public void Ausgabe_Höhen(Sections Section, Höhen Key, string Value)

.

Gibt es da was sauberes?

D
2 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-
Das ist einfach C# mit Klassen
z.B.


public class XX
{
 private string Farbe;
 private string Wert;

 public string SetFarbe(string farbe);
 Farbe = farbe;
 public string SetWert(string wert);
 Wert = wert;
 public void GetFarbe();
 return Farbe;
 public void GetWert();
 return Wert;
 public void WriteEingabe();
 Console.Write("Das ist "+Farbe+" "+Wert+"");
}
public class XXTest
{
public static void Main()
{
 XX Color = new XX();
 Color.Farbe=Console.ReadLine();
 Color.Wert=Console.ReadLine();
}
}

mfg
deafx

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo deafx,

sorry, Get- und Set-Methoden ist in C# im Wesentlichen out. Stattdessen sollte man Properties verwenden. So wie das Pulpapex oben gemacht hat.

herbivore

S
8.746 Beiträge seit 2005
vor 18 Jahren

Meeeeeeega-Out. 🙂