2015-01-09 2 views
0

Я начинаю программировать на C#, и я пытался сравнить две переменные int (C#).Каков наилучший способ написать несколько тегов, которые сравнивают две переменные.

void CompareNumber() { 
    int oneNumber; 
    int secondNumber; 

    if (oneNumber > secondNumber) 
     { 
     DoSomething(); 
     } 

    else if (oneNumber < secondnumber) 
     { 
     DoSomethingElse(); 
     } 

    else if (oneNumber == secondnumber) 
     { 
     DoSomethingDifferent(); 
     } 
} 

В то время как это действительно работает, оно выглядит беспорядочным, особенно потому, что я сравниваю переменные таким образом много раз. Есть ли более сжатый способ сделать это, заставляя его выглядеть аккуратно? (За исключением исключения фигурных скобок)

+0

Проверьте оператор [switch] (http://msdn.microsoft.com/en-us/library/06tc147t.aspx) –

+3

@JoshPart, вы не можете использовать 'switch' для сравнения с помощью' <' or '> 'операторов. – MarcinJuraszek

+1

Я не думаю, что с вашим текущим кодом что-то не так. Единственное изменение, которое вы можете сделать, это удалить последний оператор 'if', потому что он будет всегда истинным, если оба вышеописанных проверок возвращают false. – MarcinJuraszek

ответ

3

То, как вы уже написали, это лучший способ :) В этом нет ничего плохого.

Однако, когда вы говорите «особенно потому, что я сравниваю переменные таким образом много раз», там может быть что-то исправить. В идеале вы должны иметь возможность повторно использовать то, что вы написали один раз.

+0

Я всегда делаю идею, где я сравниваю, если один int больше, меньше или равен другому. Есть ли способ сделать это, чтобы я мог повторно использовать то, что я пишу один раз? –

+0

@AhkamNihardeen очень сложно предложить рефакторинг, не видя кода, который вы пытаетесь переусердствовать. Рассмотрите отправку * рабочего * кода на http: // codereview.stackexchange.com/tour, если вам нужны рекомендации по рефакторингу. –

1

Поскольку вы просите общие способы сделать, если утверждения выглядят более аккуратными, рассмотрите conditional operator «?:», Если вы назначаете значение. Это не работает для вызова функции недействительной, но если, например, вы хотите, чтобы вернуть большие из двух значений INT с CompareNumber(), вы можете сделать это:

int CompareNumber(int first, int second) 
{ 
    return first > second ? first : second; 
} 

не может сказать, что я вижу любые простые способы сделать ваш образец кода более элегантным. Если у вас есть три разных случая, вы ничего не можете пропустить. Конечно, я мог бы быть умный Алека и упростить функцию для вас (и это не будет иметь ошибки использования неинициализированных переменных):

void CompareNumber() 
{ 
    DoSomething(); 
} 

EDIT: Ранее указано, вы не можете вызывать функции с условным оператором, но Я имел в виду, что вы не можете вызвать функции void ... они должны вернуть значение или вы получите ошибку компилятора.

+1

Как вы сможете сделать последний раздел? –

+0

Руфус L прав, вы можете связать оператора. Однако он ошибается, заявляя, что они работают так же, как if/else. Если «DoSomething()» или другие функции недействительны, он не будет компилироваться (по крайней мере, не в Visual Studios 2013, где я его протестировал, «ошибка CS0201»). –

1

Вы можете сократить его, используя тройные операторы, но вы делаете это правильно.

void CompareNumber(int first, int second) { 

    (first > second) 
     ? DoSomething() 
     : (second > first) 
      ? DoSomethingElse() 
      : DoSomethingDifferent(); 
} 
+0

Ahh, Хорошо. Моя проблема здесь в том, что он может запустить метод/функцию (так как один из предыдущих ответов сказал, что вы не можете). Если так, я все же не думаю, что буду использовать это, ТОЛЬКО, потому что он жертвует большой удобочитаемостью. –

+0

Не уверен, что вы имеете в виду? Вы можете запустить этот образец как метод - просто перейдите в два целых числа! Это позволяет повторно использовать, если вы всегда хотите сделать то же самое для условных проверок. –

+0

В приведенном ниже ответе вы можете: t использовать условные выражения для вызова функций. Это правда? –

1

Вы можете использовать switch на Signum дельты:

switch (Math.Sign(Alpha - Beta)) 
{ 
case -1: // Alpha < Beta. 
    // Do something. 
    break; 
case 0: // Alpha == Beta. 
    // Do something. 
    break; 
case 1: // Alpha > Beta. 
    // Do something.   
} 

Вы можете, конечно, использовать предложение default в switch обрабатывать окончательный случай.

+0

Как это будет работать в моем случае? –

+0

Вы сравниваете два значения и, основываясь на их относительных значениях, выполняете один из трех фрагментов кода. Если вы вычтите одно значение из другого, то полученная разница сообщит вам, какое значение было больше (разница будет больше или меньше нуля) или если они были равны (разница будет равна нулю). 'Math.Sign' изменяет это на простые' 1', '0' или' -1'. Попробуй. – HABO

+0

Я вижу. Итак, мы бы обменяли альфа и бета с двумя переменными int? –

Смежные вопросы