C# Enum Drapeaux De Comparaison
Donné les indicateurs suivants,
[Flags]
public enum Operations
{
add = 1,
subtract = 2,
multiply = 4,
divide = 8,
eval = 16,
}
Comment pourrais-je mettre en œuvre un SI la condition d'exécution de chaque opération? Dans ma tentative, la première condition est vraie pour ajouter, eval, ce qui est correct. Cependant, la première condition est également vrai pour les soustraire, eval, ce qui est incorrect.
public double Evaluate(double input)
{
if ((operation & (Operations.add & Operations.eval)) == (Operations.add & Operations.eval))
currentResult += input;
else if ((operation & (Operations.subtract & Operations.eval)) == (Operations.subtract & Operations.eval))
currentResult -= input;
else
currentResult = input;
operation = null;
return currentResult;
}
Je ne vois pas quel est le problème.
- Est-ce juste moi qui pense [Drapeaux] pour l'opération indiquée n'est pas correcte? J'ai du mal à penser à un monde réel de l'échantillon où j'aurais des Drapeaux sur des opérations mathématiques montré...
- Je suis d'accord Ensoleillé. Les drapeaux étaient censés représenter les états dans une calculatrice. Je ne sais pas pourquoi j'ai fait de cette façon. Rétrospectivement, je ne voudrais pas faire de cette façon maintenant des jours.
- Double Possible de Comment faire pour Comparer les Drapeaux en C#?
Vous devez vous connecter pour publier un commentaire.
Changer votre intérieur
&
à|
:Ceci est équivalent à:
qui peut être plus lisible. Vous pouvez également envisager une Extension comme ceci:
ensuite, vous pouvez faire ceci:
qui pourrait être encore plus lisible. Enfin, vous pourrez créer cette extension pour encore plus de plaisir:
Alors votre expression pourrait se transformer en:
HasAllFlags
, parce que vous pouvez utiliserHasFlag
comme suit:if(operation.HasFlag(Operations.add | Operations.eval))
.Wow, je ne peux pas croire toutes les mauvaises réponses..
Il est important de comprendre au niveau du bit de maths si vous travaillez avec des drapeaux. Dans votre cas, vous avez le suivant (pour la première condition):
Donc, disons que nous avons une Soustraction (2) comme le
operation
Depuis le résultat précédent est
00000
rien ET avait avec elle sera de zéro. Si votre condition sera toujours évaluer àtrue
depuis0 == 0
.Si nous juste commutateur de cette de OU, puis nous avons les éléments suivants:
Maintenant, disons que nous avons
Add (1)
comme leoperation
Donc,
1 & 17 => 1
et donc votre dernière condition est(1 & ( 1 | 16 ) ) == ( 1 | 16 )
=>1 & 17 == 17
=>1 == 17
=>false
(encore faux!)Donc ce que vous voulez vraiment est:
Cela devient
((1 | 1 | 16 ) & ( 1 | 16 )) == ( 1 | 16 )
=>( 17 & 17 ) == 17
=>17 == 17
==true
Ce n'est évidemment pas lisible, alors vous devriez opter pour l'extraction de ce dans une méthode (comme l'a suggéré). Mais il est encore important de comprendre pourquoi votre état est incorrect.
Double:
Voir Comment Comparer les Drapeaux en C#?
C# 4 présente les Enum.HasFlags() méthode.
Cependant, voir Qu'est-ce qui fait que le protocole Enum.HasFlag-elle si lente? si la performance est un problème.
La raison de votre opération est un échec parce que vous avez la mauvaise expression.
(Operations.add & Operations.eval)
est toujours zéro. À gauche et à droite de votre première comparaison sont à la fois toujours à zéro. Essayez plutôt ceci - je soupçonne que c'est ce que vous avez été au bout:Essayez ceci: