Archiv

Archiv für Dezember, 2008

Set’s in C#

2. Dezember 2008 Keine Kommentare

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());
}
KategorienMicrosoft .NET Tags: ,