Laden...

enum mit mehreren Bedeutungen

Erstellt von Pedro_15 vor 18 Jahren Letzter Beitrag vor 16 Jahren 3.576 Views
P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren
enum mit mehreren Bedeutungen

Hallo,

wie kann ich folgendes Abbilden.

"Hallo", "Hi" = 0;
"Bis bald", "Tschüss" = 1;

Dafür muss ich doch zwei enum machen oder??


enum test {
  Hallo = 0;
  Bis bald = 1;
}

enum test1 {
  Hi = 0;
  Tschüss = 1;
}

Wie kann ich mehrere Bedeutungen auf auf eine Zahl legen?

Danke!

Pedro

NACHTRAG:


test a;
test1 b;

a = test.Hallo;
b = a; // Error


Wiso geht das nicht ? Ich dachte ein enum ist intern ein int oder eine anderer Zahlentype. Ich hätte gedacht b ist jetzt 1 und damit Hi.

Danke für die Hilfe

B
50 Beiträge seit 2005
vor 18 Jahren

Dazu müsstest du den Enum so umschreiben:


enum test: uint {
  Hallo = 0;
  Bis bald = 1;
}

enum test1: uint {
  Hi = 0;
  Tschüss = 1;
}

Und dann halt
b = (uint) a;

M
329 Beiträge seit 2004
vor 18 Jahren

Die Enums verhalten sich ähnlich wie Klassen.

Person p = new Person();
Haus h = new Haus();
p = h;

Wird dir ebenfalls eine Exception werfen.

Du kannst einem Enum zwar einen Wert zuweisen, aber nicht ein anderes Enum.

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

Danke!

Wie bekomme ich wenn ich Hallo habe die 0;

Geht das mit enum?

Pedro

M
329 Beiträge seit 2004
vor 18 Jahren
test a = test.Hallo;
int i = a as int;
Console.WriteLine("{0}", i);

habe ich nicht getestet, sollte aber funktionieren.

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

Nein ich habe den String "Hallo" und nicht test.Hallo.

Ich glaube enum ist vielleicht für meine Zwecke in diesem Fall vielleicht doch nicht das richtige.

N
4.644 Beiträge seit 2004
vor 18 Jahren

Schau Dir mal Enum.Parse( ... ) an.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Pedro_15

zur Eingangsfrage. Klar kann man in einem Enum mehreren Komponenten den gleichen Wert zuweisen:


enum test {
  Hallo = 0;
  Hi = 0;
  Bis bald = 1;
  Tschüss = 1;
}

herbivore

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo zusammen!

Auch wenn man innerhalb eines Enum mehrere Bedeutungen einem Wert zuweisen kann, würde ich das nicht machen, da dann ein reversives Holen der Daten zu komischen Effekten kommen kann:



	#region TestEnum
	public class TestEnum
	{
		public enum DoppelWerte
		{
			Hallo = 0,
			Test = 0,
			DuBist = 1,
			MeinFreund = 1
		}

		public TestEnum()
		{
			DoppelWerte test = DoppelWerte.MeinFreund;
			Console.WriteLine(test);

			test = (DoppelWerte) 1;
			Console.WriteLine(test);

			Console.WriteLine("Enter-Taste drücken!");
			Console.ReadLine();
		}

		#region Main Entry Point

		[STAThread]
		public static void Main()
		{
			TestEnum myApp = new TestEnum();
		}

		#endregion
	}
	#endregion


Dieses Konsolenprogramm zeigt was ich meine, denn es liefert hier:

*************************
DuBist
DuBist
Enter-Taste drücken!
*************************

Schon etwas komisch, zwar zwingend logisch begründbar, aber sicherlich nicht erwünscht, oder?

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo norman_timo,

tja, kommt immer drauf an, was man will. Zumal man mit


foreach (String strName in Enum.GetNames (typeof (DoppelWerte))) {
   Console.WriteLine (strName);
}

immer noch an alle Bezeichnungen kommt.

herbivore

M
49 Beiträge seit 2005
vor 18 Jahren

Guten Abend.

Irgendwie erscheint mir das ursprüngliche Problem mit enums nicht adäquat gelöst. Es scheint sich ja um eine Zuorndung von Strings zu Ganzzahlen zu handeln, daher würde ich eine Hashtable bzw. ab .NET 2.0 die generische Klasse Dictionary<string,int> verwenden.

Aber vielleicht sind auch ja die sog. Flags gewünscht hierzu ein Beispiel:


static void Main(string[] args)
{
	Test s = Test.WertA;
	Console.WriteLine(s); // Ergibt: WertA

	s = Test.WertC | Test.WertF;
	Console.WriteLine(s); // Ergibt: WertC, WertF

	s = Test.SonderWert1;
	Console.WriteLine(s); // Ergibt: SonderWert1

	Console.ReadLine();
}

[Flags]
enum Test
{
	WertA = 0x1,
	WertB = 0x2,
	WertC = 0x4,
	WertD = 0x8,
	WertE = 0x10,
	WertF = 0x20,
	WertG = 0x40,
	WertH = 0x80,
	SonderWert1 = WertA | WertH,
	SonderWert2 = WertA | WertC | WertB
}

Das nächste mal vielleicht einfach etwas genauer schildern was erreicht werden soll.

-Martin Ehrlich


Martin Ehrlich

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

Also zum Ursprung zurück.

Ich habe drei verschiedene Stellen woher ich werte bekomme.
Die wie das Leben so spielt natürlich alle anders geschrieben sind.
Mit diesen Werte muss ich durcheinander arbeiten und die Werte stehen fest und werden im Code abgefragt (z.B. if (variable ==A) usw. )

Beispiel

  1. Quelle
    A
    B
    C

  2. Quelle
    AA
    BB
    CC

  3. Quelle
    AAA
    BBB
    CCC

Zusammenfassung
A == AA == AAA
usw.

So jetzt habe ich drei enum mit den Werten angelegt
Enum Quelle1
A,
B,
C

Enum Quelle2
AA = Quelle1.A,
BB = Quelle1.B,
CC = Quelle1.C

usw.

Im gesamten Programm arbeite ich jetzt mit den int Werten und habe kein Problem mehr mit den Unterschidlichen Quellen.

Es funktioniert, aber ob das so richtig umgesetzt ist, kann ich mir eigentlich nicht vorstellen.

Pedro

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Pedro_15,

klingt doch nicht schlecht, vorausgesetzt du meinst: Im gesamten Programm arbeite ich jetzt mit den enum Werten.

herbivore

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 18 Jahren

Genau zu sein mit den enum int Werten.

da ja (int)Quelle1.A == (int)Quelle2.AA == (int)Quelle3.AAA

Ich weiss nicht ob, ob das gestimmt hätte.

Quelle1.A == Quelle2.AA == Quelle3.AAA

Pedro

B
325 Beiträge seit 2005
vor 16 Jahren

Klar kann man in einem Enum mehreren Komponenten den gleichen Wert zuweisen

Geht das auch anderes herum: also einer Komponenten mehrere Werte zuweisen?

B
1.529 Beiträge seit 2006
vor 16 Jahren

Und wer soll dann entscheiden, wann welcher Wert zu verwenden ist?
Kurz gesagt: Nein.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo BillTuer,

weiß ja nicht, was du genau willst, aber man kann natürlich Enums als Flags verwenden. Wie das geht, haben wir schon in einem anderen Thread besprochen.

herbivore

B
325 Beiträge seit 2005
vor 16 Jahren

Ich habe verschiedene Gruppen in einer DB, jede mit einer eindeutigen ID. Nun gehören verschiedene Gruppen wiederum zueinander, man kann sie also zu Übergruppen zusammenfassen. Dies kann/soll allerdings nicht in der DB abgelegt werden.

Ich will nun in meinem Programm eine Möglichkeit einbauen, mit der ich sagen kann: hole mir alle Daten einer Übergruppe. Die Übergruppen habe ich in einem Enum. Nun suche ich eine Möglichkeit, den einzelnen Übergruppen im Übergruppen-Enum die IDs der Gruppen zuzuweisen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo BillTuer,

verwende ein konstantes jagged Array. Verwende die Übergruppen als Index in das Haupt-Array. Die Unter-Arrays enthalten dann die zugehörigen Gruppen.

Im Zweifel siehe http://www.galileocomputing.de/openbook/visual_csharp/

herbivore