Есть ли более эффективный/читабельный/красивый способ написать это условие?

Я изучаю условные операторы на С# и понимаю, как они в основном работают.

A ? B : C

Где A = логическое условие

B = результат, когда A == True

C = результат, когда A == False

Моя проблема больше в написании сложного условия. Я пытаюсь написать:

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

Я бы предпочел условие, которое больше похоже на:

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

но это будет работать только тогда, когда A, B и C являются логическими значениями, и я пытаюсь сравнить целые числа.

Если нет простого способа сократить это, то все в порядке. Я просто пытался работать над тем, чтобы сделать мой код более эффективным и легким для чтения.

Спасибо

            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 — это целое число

radioButtonPass является целым числом

radioButtonFail - это целое число

PassedBool — логическое значение, допускающее значение NULL.

По сути, если CheckedRadioButtonId равен либо radioButtonPass, либо radioButtonFail, я хочу, чтобы для PassedBool было установлено значение true или false, в противном случае я хочу, чтобы оно было нулевым.


person Wesley DaBes    schedule 17.04.2020    source источник
comment
работает только тогда, когда A, B и C являются логическими значениями - работают как при компиляции, но это сильно отличается от того, что вы хотите. И нет, в языке нет такого ярлыка.   -  person madreflection    schedule 17.04.2020
comment
{B,C} содержит A...   -  person Selvin    schedule 17.04.2020
comment
Я действительно не понимаю, почему вы думаете, что ваша версия проще для чтения.   -  person DavidG    schedule 17.04.2020
comment
Можете ли вы опубликовать свое реальное условное утверждение, а не   -  person Rahul    schedule 17.04.2020
comment
Вы не можете делать то, что хотите. Язык не такой продвинутый. Вам придется использовать один с двумя равными сравнениями.   -  person Lasse V. Karlsen    schedule 17.04.2020


Ответы (3)


Как заявил madreflection, это не делает то, что вы думаете.

Давайте рассмотрим случай, когда
A = False
B = True
C = False

Для
(A == B || A == C) ? D : E
A не равно B, но A равно C, поэтому результат D

Для
A == (B || C) ? D : E
B||C равно true. А не равно истинному. Итак, результат Е.

И нет, для этой логики нет встроенного ярлыка.

Однако в прошлом я писал методы расширения в коде, где я часто делаю много A==X || А==Y || А == Z

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

Который вы могли бы назвать так

if( A.In(X,Y,Z)){  
//do stuff  
}  
person Kevin    schedule 17.04.2020
comment
Спасибо! Итак, нужен инструмент, создайте ситуацию с инструментом. - person Wesley DaBes; 17.04.2020

Вы можете сделать это, проверив первое в if, а затем протестировав второе в else if с окончательным else для нуля, если ни одно из них не совпадает. (Вы также можете сделать это как оператор switch с двумя вариантами и значением по умолчанию, но только если значения Pass и Fail являются константами, что было неясно.)

Еще один способ, который вы ищете, - это связать два условных выражения в одно выражение, чтобы имитировать 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)
    );

Это, вероятно, соответствует «красивее» и «более эффективно», поскольку позволяет избежать повторного сравнения (ваш оригинал дважды сравнивается с radioButtonPass); также обратите внимание, что ? : — это выражение, поэтому оно должно оцениваться как значение, а не выполнять присваивание (хотя вы можете по закону делать и то, и другое; значение присваивания — это просто значение, которое было присвоено, поэтому вы можете связать присваивания, такие как A = B = C;, чтобы установить A и B оба на значение C). В вашем случае вы просто хотите присвоить определенное значение одному месту, поэтому это более уместно, когда условное выражение находится в выражении RValue присваивания.

person Rob Parker    schedule 17.04.2020

Есть много способов сделать это. Например, вы также можете сделать это с помощью Linq

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

var result = BArr.Contains(A);
person Dan Csharpster    schedule 12.05.2020