C# Bitmaske mit Enum (Flags Attribute)


Bisher habe ich noch nie Gebrauch von einer Bitmaske gemacht, aber heute musste ich mich kurz mit der Thematik auseinandersetzten und wollte hier kurz zeigen was zu welchem Ergebnis führt, wenn man mit einer Bitmaske und einem Enum mit dem “Flags” Attribut arbeitet.

Als Beispiel habe ich mir ein Enum mit den Wochentagen Montag bis Sonntag erstellt, hier darf das Attribut “Flags” nicht vergessen werden, denn nur dann kann mit den Werten Bitweise gerechnet werden. (Was Bitweise genau bedeutet findet man im Netz genug Beispiele.)

[Flags]
public enum WeekDays
{
    Mon = 1,
    Tue = 2,
    Wed = 4,
    Thu = 8,
    Fri = 16,
    Sat = 32,
    Sun = 64
}

Ich werde im Folgenden einfach ein paar Beispiele Zeigen wie man z.B. Wochentage zu einer Weekdays Variable hinzufügt, entfernt und überprüft ob ein einzelner Wochentag enthalten ist oder mehrere Wochentage.

//Tage zu unserer Variablen hinzufügen
WeekDays days = WeekDays.Mon;
days |= WeekDays.Tue;
days |= WeekDays.Fri;
//geht auch so:
//WeekDays days = WeekDays.Mon |  WeekDays.Tue | WeekDays.Fri;

//Prüfen ob der "Tue" in unseren Tagen enhalten ist.
if (days.HasFlag(WeekDays.Tue))
{
    //Unsere Tage als Int ablegen um z.B. in der Db zu speichern
    int daysAsInt = ((int)days);

    //Unseren Int wert wieder umwandeln in die Tage die wir ausgewählt hatten
    WeekDays daysFromInt = (WeekDays)daysAsInt;

    //Prüfen ob unser umgewandelter Intwert auch noch den Freitag enthält
    if (daysFromInt.HasFlag(WeekDays.Fri))
    {
        //Wird erreicht, da der Freitag noch enthalten ist.
        string found = "found";
    }

    //Prüfen ob der Donnerstag enthalten ist.
    if (daysFromInt.HasFlag(WeekDays.Thu))
    {
        //Wird nicht erreicht, da kein Donnerstag enthalten ist.
        string notFound = "notFound";
    }
}

//Prüfen ob genau diese drei Tage enhalten sind
if (days == (WeekDays.Mon | WeekDays.Tue | WeekDays.Fri))
{
    //Wird erreicht, da genau die drei Tage enthalten sind.
    string allRights = "alle Tage enthalten";
}

//Prüfen ob genau diese beiden Tage enthalten sind
if (days == (WeekDays.Mon | WeekDays.Tue))
{
    //Wird nicht erreicht, da der "Fri" Fehlt und die
    //Objekt damit nicht gleich sind
    string allRights = "nicht alle Tage enthalten";
}

//Prüfen ob alle Tage enthalten sind
if (days == (WeekDays.Mon | WeekDays.Tue | WeekDays.Fri | WeekDays.Sat))
{
    //Wird nicht erreicht da ein Tag zuviel gesucht wird "Sat"
    string allRights = "nicht ein Tag enthalten";
}

//Prüfen ob in unserer Tageliste einer der drei Tage enthalten ist,
//da "Mon" enthalten ist, wird daysCheck1 größer 0 sein
WeekDays daysCheck1 = (days & (WeekDays.Mon | WeekDays.Sun| WeekDays.Sat));
if (daysCheck1 != 0)
{
    //Wird erreicht, da mind. einer der Tage "Mon" enthalten ist.
    string allRights = "mind ein Tag enthalten";
}

//Prüfen ob in unserer Tagesliste einer der drei Tage enthalten ist,
//da keiner der Tage enthalten ist wird daysCheck2 gleich 0 sein.
WeekDays daysCheck2 = (days & (WeekDays.Wed | WeekDays.Sun | WeekDays.Sat));
if (daysCheck2 != 0)
{
    //Wird nicht erreicht, da keiner der Tage enthalten ist.
    string allRights = "kein Tag enthalten";
}

//Direktes Prüfen ob "Mon" und "Tue" in der Liste enthalten sind.
if ( (days & (WeekDays.Mon | WeekDays.Tue)) != 0)
{
    //Wird erreicht, da mind. einer der Tage enthalten ist.
    string allRights = "alle Tage enthalten";
}

//Entfernen eines Tages
days -= WeekDays.Tue;

//Prüfen ob der Tag noch enthalten ist.
if (days.HasFlag(WeekDays.Tue))
{
    //Wird nicht erreicht, da kein Dienstag mehr enthalten ist.
    string notFound = "notFound";
}
Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s