2016-09-20 3 views
1

Wie können die Enum-Werte von einem int-Eingang erhalten? Sagen wir, ich habe dieses enum unten.Get Enum Werte von int

[Flags] 
public enum Weeks 
{ 
    Sunday = 1, 
    Monday = 2, 
    Tuesday = 4, 
    Wednesday = 8, 
    Thursday = 16, 
    Friday = 32, 
    Saturday = 64 
} 

public List<Weeks> GetEnumValues(int input) 
{ 
    // Don't know what is the logic here 
    // Help is much appreciated 
} 

Dann ist die Ausgabe wie folgt

Examples: 
1.) input = 3; This means Sunday and Monday hence 1 + 2 = 3; This should return List<Weeks> { Sunday, Monday } 
2.) input = 20; This means Tuesday and Thursday hence 4 + 16 = 20; This should return List<Weeks> { Tuesday, Thursday } 
3.) input = 40; This means Wednesday and Friday hence 8 + 32 = 40; This should return List<Weeks> { Wednesday, Friday } 

Vielen Dank im Voraus.

+0

Sie müssen nur 2 Elemente von Enum zurückgeben oder müssen Sie mehr Elemente erhalten, wenn die Eingabe> 40 ist? –

+0

Hi Ga ber-ber, Danke, aber ich denke du verstehst was ich versuche zu erreichen. – mercu

+0

Könnte mehr sein. Ein gutes Beispiel für die Anwendung dieser Art von Situation ist die Anwendung in der Sicherheit. Ein Benutzer kann mehrere Sicherheit haben, nicht nur 2. – mercu

Antwort

3

Sie können dies tun, indem Sie jedes enum "Flag" durchlaufen und jedes "Flag" prüfen, wenn das Bit in Ihrem Eingabewert gesetzt ist. Hier ist eine Möglichkeit, dies zu tun:

public List<Weeks> GetEnumValues(int input) 
{ 
    Weeks inputEnum = (Weeks)input; 
    var list = new List<Weeks>(); 

    foreach(var enumFlag in Enum.GetValues(typeof(Weeks)).Cast<Weeks>()) 
    { 
     if (inputEnum.HasFlag(enumFlag)) 
     { 
      list.Add(enumFlag); 
     } 
    } 

    return list; 
} 
+0

das sollte keine liste enums sein – Sherlock

+1

@Sherlock: ich verstehe nicht was du meinst. OP bittet um eine Liste von "Weeks" -Werten. – sstan

+0

yah aber OP ist falsch, es sollte eine Liste der Zeichenfolge sein – Sherlock

0

Ein anderer Ansatz - macht sich die Tatsache zunutze, dass ToString auf einem Flags Enum eine durch Kommata getrennte Liste der Werte aufbaut. Dann können wir das nehmen und jedes Element auf den ENUM-Wert über Enum.Parse konvertieren zurück:

public List<Weeks> GetEnumValues(int input) 
{ 
    return ((Weeks)input) 
     .ToString() 
     .Split(',') 
     .Select(day => Enum.Parse(typeof(Weeks), day)) 
     .ToList(); 
} 

haben die Wahl ...

0

@ sstan Antwort richtig ist und ich als Antwort gewählt. Aber ich möchte auch nur meine kurze Version von seiner Lösung teilen.

public List<Weeks> GetEnumValues(int input) 
{ 
    Weeks inputEnum = (Weeks)input; 
    return Enum.GetValues(typeof(Weeks)).Cast<Weeks>().Where(x => inputEnum.HasFlag(x)).ToList(); 
}