2010-11-26 2 views
2

C'est une question basique que je connais, et sûrement une refonte d'une vieille recette faite par tout le monde sur la planète terre et au-delà, mais je suis tellement perdu que j'ai besoin de Conseil.Drapeaux et enum pour faire un linq anyFlags (MyFlag)

j'ai un ENUM comme celui-ci:

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

et j'ai une valeur ENUM comme:

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

afin de dire ce que je compris s = 10

Maintenant, j'ai une valeur dans ma base de données qui est un court et pourrait être l'un de ceux-ci, à savoir: 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 

Maintenant, j'ai besoin d'obtenir une instruction linq pour dire quel id a au moins une autre énumération donnée dans s.

Je voudrais à la fin: 1,2,3,4.

Je l'ai fait pour la méthode des thèses:

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); 
} 

mais je suis coincé avec celui-ci:

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

Ils assez bien, mais je maintenant je besoin de cette méthode qui me donnerait 1,2,3,4 comme résultat souhaité. J'ai essayé pas mal de choses mais je n'arrive pas à le faire correctement. L'un de vous a-t-il des solutions prêtes pour cela?

Merci à l'avance,

PS: J'utilise C# 3.5

Répondre

1

Envisagez votre méthode HasAllFlags. Il effectue un ET sur la valeur de test et la valeur requise. Le résultat de ceci sera une valeur où chaque bit est positionné si-et-seulement-s'il est défini dans la valeur de test ET il s'agit d'une valeur requise. En vérifiant cette valeur de résultat par rapport à l'ensemble des indicateurs obligatoires , vous obtenez votre réponse.

Toutefois, cette même valeur de résultat peut également être utilisée pour vérifier si des indicateurs requis étaient présents. Si des drapeaux requis étaient présents, cette valeur de résultat sera différente de zéro. Donc tout ce que nous avons besoin est

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

(Notez que le comportement si matchTo est 0 pourrait ne pas être ce que vous attendez)

Exemples (en binaire):

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

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

qui ne fonctionnera pas. si l'entrée a un drapeau non donné dans matchTo, la valeur de l'ET ne sera pas non plus nulle. – Bryan

+0

@Brian pas tout à fait avec vous, pourriez-vous donner un exemple? – AakashM

+0

Merci pour la belle explication AakashM! – Arthis

2

Que diriez-vous simplement comparer avec (Enum) 0?

+0

désolé mais je ne Obtenez votre réponse. vous voulez dire retour (enum) 0; ? – Arthis

+0

Vous voulez juste voir si une énumération a des drapeaux, non? Eh bien, si ce n'est pas la valeur d'enums sera 0. – SWeko