Hallo Freunde,
wie stelle ich diese Struktur dar, damit ich später auswählen kann
...Gruppen.Farben.Farbe1
?
Gruppen
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.
Hallo -acid-,
public class Gruppen
{
public enum Gruppe1 {
Wert1,
Wert2
}
public enum Farben {
Farbe1,
Farbe2
}
}
herbivore
*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.
Hallo -acid-,
wie lautet denn dein Aufruf?
herbivore
// Methode
Ausgabe(Gruppen Gruppe)
{
MBox...Gruppe...
}
// Aufruf (Hier kommt der Fehler)
Ausgabe(Gruppen.Farben.Farbe1);
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
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:
Verstanden?
Und um nochmals zu ergänzen:
Diese Struktur möchte ich temporär speichern und am Ende des Scriptes in eine Datei speichern.
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
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:
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
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
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
@Pulpapex: Danke erstmal. Leider kann ich das erst heute Abend ausprobieren.
Es sollen keine neuen Optionen hinzugefügt werden können. Allein der Code der Klasse bestimmt die Auswahl.
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...
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
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.
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.
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?
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.
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?
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
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