Set’s in C#
Seit dem Wechsel von Delphi auf C# habe die sprechende Art, mit Aufzählungen zu arbeiten, vermisst:
type Right = (rRead, rWrite, rDelete); Rights = set of Right; var rightSet: Rights; begin rightSet := [rRead, rWrite]; Writeln('Schreibrecht: ' + BoolToStr(rWrite in rightSet)); rightSet := rightSet - [rWrite]; Writeln('Schreibrecht: ' + BoolToStr(rWrite in rightSet)); Readln; end. |
Das gleiche in C# war durchaus effektiv und klar, aber die boolschen Operationen lassen sich oft nicht so intuitiv lesen bzw. umsetzen:
[Flags] enum Rights { Read = 1, Write = 2, Delete = 4, } private static void BoolscherCode() { // üblicher Code Rights rights = Rights.Read | Rights.Write; // prüfen, ob Schreiben enthalten ist: Console.WriteLine("Schreibrecht: " + ((rights & Rights.Write) == Rights.Write).ToString()); // Schreibrecht entfernen rights &= ~Rights.Write; // prüfen, ob Schreibrecht enthalten ist: Console.WriteLine("Schreibrecht: " + ((rights & Rights.Write) == Rights.Write).ToString()); } |
Wintellect bietet mit seiner PowerCollection hier durchaus einen Ausweg:
enum Rights { Read, Write, Delete } private static void ListenCode() { Wintellect.PowerCollections.Set rights = new Wintellect.PowerCollections.Set(); rights.Add(Rights.Read); rights.Add(Rights.Write); // prüfen, ob Schreiben enthalten ist: Console.WriteLine("Schreibrecht: " + (rights.Contains(Rights.Write)).ToString()); // Schreibrecht entfernen rights.Remove(Rights.Write); // prüfen, ob Schreibrecht enthalten ist: Console.WriteLine("Schreibrecht: " + (rights.Contains(Rights.Write)).ToString()); } |