Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C#] Set of Enum (https://www.delphipraxis.net/96991-%5Bc-%5D-set-enum.html)

cruiser 2. Aug 2007 17:42


[C#] Set of Enum
 
Gibt es sowas wie Sets in C#? Wenn ja, wie definier ich die? ;)

Khabarakh 2. Aug 2007 18:13

Re: [C#] Set of Enum
 
Die Antwort lautet "ganz einfach", was gleichzeitig auch nahelegt, dass Sets in C# nicht so schön in die Sprache eingebettet sind wie in Pascal; du musst einfach deinen Enum-Typen als das betrachten, was ein Set nativ ist: ein Bitvektor.
Nun aber mal weg von der Theorie und in die Praxis: Wir müssen erst einmal dafür sorgen, dass jeder enum-Wert wirklich ein anderes Bit für sich beansprucht:
Code:
 [Flags]
    enum MultiHue : short
    {
        Black = 0,
        Red = 1,
        Green = 2,
        Blue = 4
    };
(frech geklaut aus dem SDK; das Flags-Attribut verdeutlicht, dass die Enum-Werte gemixt werden können und wird z.B. bei ToString() herangezogen, ist aber für die reine Manipulation unwichtig)
Der Rest ist einfache Bitrechnerei - nicht so komfortabel wie in Pascal, aber irgendwie... geeky *g* .
Kombination:
Code:
MultiHue.Blue | MultiHue.Red
(bitweises OR)
Entfernen eines Flags aus einem Set:
Code:
set & !MultiHue.Green
(and not)
Prüfung auf ein oder mehrere Flags:
Code:
(set & subset) == subset
oder
Code:
(set & subset) != 0

Jürgen Thomas 2. Aug 2007 18:20

Re: [C#] Set of Enum
 
Sets gibt es eigentlich nicht. Stattdessen können - je nach Ziel - genutzt werden:
Code:
//  Enumeration entspricht dem am ehesten
public enum ProgramVersion {
   Normal, Test, School
}
//  List<T> - erst ab NET 2.0
public List<int> myList = new List<int>();
myList.Add(1);
myList.Add(3); //  usw.
//  Dictionary<TKey, TValue> - erst ab NET 2.0
public Dictionary<int, string> myDict = new Dictionary<int, string>();
myDict.Add(1, "eins");
myDict.Add(3, "drei");  // usw.
Unter NET 1.1 kann statt List<T> ArrayList und statt Dictionary<TKey, TValue> HashTable verwendet werden.

Ein "Mangel" an enum könnte angesehen werden, dass nicht unmittelbar festgestellt werden kann, ob ein Wert zur Enumeration gehört. Dafür hilft Enum.Parse-Methode.

Ich hoffe, es bringt Dich weiter. Jürgen

cruiser 2. Aug 2007 18:37

Re: [C#] Set of Enum
 
Dank euch soweit... ich war schon kurz davor das in ein Array zu wrappen ;)

EDIT: es klappt auch += zum adden und -= zum entfernen von Flags

Code:
public enum n: uint {
  None = 0,
  a = 1,
  b = 2,
  c = 4,
  All = 7
}

// ...

n e = n.All;
e -= n.b; // ergibt n.a | n.c

//...

n e = n.None;
e += n.a; // ergibt n.a
e += n.c; // ergibt n.a | n.c
e += n.b; // ergibt n.All
nur das mit dem Herausfinden ob ein Flag drin ist mit & klappt nich

EDIT 2: okay... mit Klammern gehts doch:

Code:
if ((c & n.a) != 0) {
  // prüfung ob es schon drin ist
}

if ((c & n.a) == 0) {
  // prüfung ob es noch nicht drin ist
}
EDIT 3:

+= und -= sind nich gut ;)

besser ist (zusammengefasst):
Code:
set |= subset; // hinzufügen
set &= ~subset; // entfernen
if ((set & subset) == subset) {
  // subset ist im set
}
if ((set & subset) != subset) {
  // subset ist nicht im set
}


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz