0
votes

Existe-t-il un moyen plus efficace / lisible / plus joli d'écrire ce conditionnel?

J'apprends les conditions en C # et je comprends comment elles fonctionnent.

A? B: C

Où A = Condition booléenne

B = résultat lorsque A == Vrai

C = Résultat lorsque A == Faux

Mon problème est plus d'écrire une condition complexe. J'essaye d'écrire:

(A == B || A == C)? D: E

Je préférerais une condition qui ressemblerait plus à:

A == (B || C)? D: E

mais cela ne fonctionnerait que lorsque A, B et C sont des booléens et que j'essaye de comparer des entiers.

S'il n'y a pas de moyen simple de couper ceci vers le bas alors ce n'est pas grave. Je viens d'essayer de rendre mon code plus efficace et plus facile à lire.

Merci

            var passedRadioGroup = (RadioGroup)sender;
            (passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonPass || passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonFail) ?
                checklistItems[passedRadioGroup.Id].PassedBool = passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonPass :
                checklistItems[passedRadioGroup.Id].PassedBool = null;

CheckedRadioButtonId est un int

radioButtonPass est un int

radioButtonFail est un int

PassedBool est un bool nullable

Essentiellement, si CheckedRadioButtonId est égal à radioButtonPass ou radioButtonFail, je veux PassedBool doit être défini sur true ou false, sinon je veux qu'il soit nul.


5 commentaires

"ne fonctionne que lorsque A, B et C sont des booléens" - "fonctionne" comme dans la compilation, mais c'est une condition très différente de ce que vous voulez qu'elle fasse. Et non, il n'y a pas de raccourci comme ça dans la langue.


{B, C} contient A ...


Je ne comprends pas vraiment pourquoi vous pensez que votre version est plus simple à lire.


Pouvez-vous plutôt publier votre vraie déclaration conditionnelle


Tu ne peux pas faire ce que tu veux. La langue n'est pas si avancée. Vous devrez utiliser celui avec deux comparaisons égales.


3 Réponses :


2
votes

Comme l'a déclaré madreflection, cela ne fait pas ce que vous pensez que cela fait.

Examinons le cas où
A = Faux
B = Vrai
C = False

Pour
(A == B || A == C)? D: E
A n'est pas égal à B mais A est égal à C donc le résultat est D

Pour
A == (B || C)? D: E
B || C est égal à vrai. A n'est pas égal à vrai. Donc le résultat est E.

Et non, il n'y a pas de raccourci intégré pour cette logique.

J'ai, cependant, écrit des méthodes d'extensions dans le passé dans du code où je trouve fréquemment moi-même faisant beaucoup de A == X || A == Y || A == Z

if( A.In(X,Y,Z)){  
//do stuff  
}  

Que vous pourriez alors appeler ainsi

public static bool In(this int val, params int[] compareTo){
    for(int i=0;i<compareTo.Length; i++){
        if(compareTo[i] == val)
            return true;
    }
    return false;
} 


1 commentaires

Merci! C'est donc un besoin d'un outil, faire une situation d'outil.



0
votes

Vous pouvez le faire en testant le premier dans un if, puis en testant le second dans un else if avec un final else pour le null si aucun des deux ne correspond. (Vous pouvez également le faire comme une instruction switch avec deux cas et une valeur par défaut - mais seulement si les valeurs de réussite et d'échec sont des constantes, ce qui n'était pas clair.)

Une autre façon et plus ce que vous recherchez serait be pour enchaîner deux conditionnelles en une seule expression pour imiter if-else-if-else:

var passedRadioGroup = (RadioGroup)sender;
checklistItems[passedRadioGroup.Id].PassedBool =
    (passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonPass
        ? true
        : (passedRadioGroup.CheckedRadioButtonId == Resource.Id.radioButtonFail
            ? false : null)
    );

Cela rencontre probablement "plus joli" et "plus efficace" car cela évite la comparaison répétée (votre original se compare deux fois à radioButtonPass ); notez également que ? : est une expression, elle doit donc être évaluée à une valeur, pas exécuter une affectation (bien que vous puissiez légalement faire les deux; la valeur d'une affectation est simplement la valeur qui a été affectée, vous pouvez donc enchaîner des affectations comme A = B = C; pour définir A et B tous les deux sur la valeur de C ). Dans votre cas, vous voulez simplement attribuer la valeur déterminée à un seul endroit, donc c'est plus approprié comme ceci où le conditionnel est dans l'expression RValue de l'affectation.


0 commentaires

0
votes

Il existe de nombreuses façons de procéder. Par exemple, vous pouvez également le faire avec Linq

int A = 2;
int[] BArr = new int[]{3,2};

var result = BArr.Contains(A);


0 commentaires