2010-11-26 5 views
2

Dies ist eine grundlegende Frage, die ich kenne, und sicherlich ein Redo eines alten Rezepts von jedem auf der Erde und darüber hinaus gemacht, aber ich bin so verloren, dass ich etwas externes brauche Rat.Flags und enum um eine linq anyFlags zu erstellen (MyFlag)

Ich habe eine Enumeration wie diese:

[Flags] 
    public enum MyEnum 
    { 
     none=0, //0000 
     toto=1, //0001 
     tata=2, //0010 
     tati=4, //0100 
     titi=8 //1000 
    } 

und ich habe einen Enum-Wert, wie ist:

MyEnum s= tata | titi; //(1010) 

, um von zu sagen, was ich s verstanden = 10

Jetzt habe ich einen Wert in meiner Datenbank, der ein kurzer ist und einer dieser sein könnte, zB: 1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15

id  EnumValue 
1  3 
2  14 
3  10 
4  9 
5  0 

Jetzt muss ich eine Linq-Anweisung zu sagen, welche ID mindestens eine andere enum in s gegeben haben.

Ich würde am Ende benötigen: 1,2,3,4.

Ich habe so für Thesen Methode durchgeführt:

public static bool HasAllFlags(this short input, Enum matchTo) 
{ 
    return (Convert.ToUInt32(input) & Convert.ToUInt32(matchTo)) == Convert.ToUInt32(matchTo); 
} 

public static bool IsFlag(this short input, Enum matchTo) 
{ 
    return Convert.ToUInt32(input)== Convert.ToUInt32(matchTo); 
} 

aber mich mit diesem steckte:

public static bool HasAnyFlags(this short input, Enum matchTo) 
     { 
      return ....????....; 
     } 

Sie ziemlich gut funktionieren, aber ich brauche ich jetzt diese Methode, die mir geben würde, 1,2,3,4 als das gewünschte Ergebnis. Ich habe einige Dinge ausprobiert, aber ich kann es nicht richtig machen. Hat jemand von Ihnen irgendwelche Lösungen dafür bereit?

Vielen Dank im Voraus,

PS: I C# 3.5

Antwort

1

Betrachten Sie Ihre HasAllFlags Methode. Es führt ein bitweises AND auf dem Testwert und dem erforderlichen Wert durch. Das Ergebnis davon ist ein Wert, bei dem jedes Bit gesetzt ist, wenn und nur wenn es in dem Testwert gesetzt ist und es ein erforderlicher Wert ist. Durch Überprüfen dieses Ergebniswerts gegen die Menge von alle erforderlichen Flags erhalten Sie Ihre Antwort.

Derselbe Ergebniswert kann jedoch auch verwendet werden, um zu überprüfen, ob der erforderlichen Flags vorhanden sind. Wenn einer der der erforderlichen Flags vorhanden sind, wird dieser Ergebniswert ungleich Null sein. Also alles, was wir brauchen, ist

public static bool HasAnyFlags(this short input, Enum matchTo) 
{ 
    return (Convert.ToUInt32(input) & Convert.ToUInt32(matchTo)) 
      != Convert.ToUInt32(0); 
} 

(Beachten Sie, dass das Verhalten, wenn matchTo ist 0 vielleicht nicht, was Sie erwarten)

Beispiele (binär):

input 101010 
matchTo 001100 
result 001000 -> nonzero -> true 

input 101010 
matchTo 010001 
result 000000 -> zero -> false 
+0

das wird nicht funktionieren. Wenn die Eingabe ein Flag hat, das in matchTo nicht angegeben ist, ist der Wert von AND ebenfalls nicht Null. – Bryan

+0

@Bryan nicht ganz mit dir, könntest du ein Beispiel geben? – AakashM

+0

Danke für die nette Erklärung AakashM! – Arthis

2

Wie wäre es nur mit (Enum) 0 Vergleich verwenden?

+0

leid, aber ich habe nicht Bekomme deine Antwort. du meinst return (enum) 0; ? – Arthis

+0

Sie wollen nur sehen, ob ein Enum Flag gesetzt hat, oder? Nun, wenn es nicht der Enums-Wert wird 0. – SWeko

Verwandte Themen