![]() |
[C#] Set of Enum
Gibt es sowas wie Sets in C#? Wenn ja, wie definier ich die? ;)
|
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:
(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)
[Flags]
enum MultiHue : short { Black = 0, Red = 1, Green = 2, Blue = 4 }; Der Rest ist einfache Bitrechnerei - nicht so komfortabel wie in Pascal, aber irgendwie... geeky *g* . Kombination:
Code:
(bitweises OR)
MultiHue.Blue | MultiHue.Red
Entfernen eines Flags aus einem Set:
Code:
(and not)
set & !MultiHue.Green
Prüfung auf ein oder mehrere Flags:
Code:
oder
(set & subset) == subset
Code:
(set & subset) != 0
|
Re: [C#] Set of Enum
Sets gibt es eigentlich nicht. Stattdessen können - je nach Ziel - genutzt werden:
Code:
Unter NET 1.1 kann statt List<T> ArrayList und statt Dictionary<TKey, TValue> HashTable verwendet werden.
// 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. 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 |
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:
nur das mit dem Herausfinden ob ein Flag drin ist mit & klappt nich
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 EDIT 2: okay... mit Klammern gehts doch:
Code:
EDIT 3:
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 } += 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 02:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz