Есть ли более эффективный / читабельный / более привлекательный способ написания этого условия? - PullRequest
0 голосов
/ 17 апреля 2020

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

А? 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 - это int

radioButtonPass - это int

radioButtonFail - int

PassedBool - обнуляемый bool

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

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Как говорилось в 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. А не равно истине. В результате получается E.

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

Однако в прошлом я писал методы расширений в коде, где я часто ловлю себя на том, что много делаю == X A == Y || A == 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  
}  
0 голосов
/ 17 апреля 2020

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

Другой способ и больше того, чем вы являетесь поиск будет состоять в том, чтобы объединить два условия в одно выражение, чтобы mimi c 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 присваивания.

...