Лучшая альтернатива многим вложенным операторам if в этом контексте? - PullRequest
1 голос
/ 15 марта 2012
if (task1 != null)
    //Do something with task1
else
{
     if (task2 != null)
         //Do something with task2
     else
     {
         if (task3 != null)
             //Do something with task3
         else
         {
             if (task4 != null)
                 //Do something with task4
         }
     }
}

Есть ли альтернатива вышеуказанному коду? Я ищу своего рода «более плоский» способ выбора корпуса переключателя для задач в зависимости от того, что не равно нулю.

Большое спасибо заранее всем, кто может помочь.

Ответы [ 4 ]

13 голосов
/ 15 марта 2012

Они все одного типа?И вы хотите сделать то же самое в каждой отрасли?Если это так, вы можете использовать null-coalescing:

var chosenTask = task1 ?? task2 ?? task3 ?? task4;
// do something with chosenTask
3 голосов
/ 15 марта 2012

заставляет все задачи реализовывать ITask с помощью метода Run () и добавлять задачи, которые вы хотите запустить, в ICollection, чтобы вы могли выполнять итерации по ним.

foreach (var task in TaskCollection) {
   task.Run();
}
3 голосов
/ 15 марта 2012

Зависит от того, что ваш метод делает что-то еще.Если этого не произойдет, вы можете использовать:

if (task1 != null)
{
    // Do something with task1
    return;
}
if (task2 != null)
{
    // Do something with task2
    return;
}
if (task3 != null)
{
    // Do something with task3
    return;
}
if (task4 != null)
{
    // Do something with task4
    return;
}

(я собирался добавить то же самое, что говорил Марк - если вы собираетесь сделать то же самое св зависимости от того, какая задача вначале не равна нулю, оператор , объединяющий нуль , действительно является вашим другом.)

1 голос
/ 15 марта 2012

вы можете использовать условный оператор, с условием, что вам нужна некоторая переменная слева

var v = task1 != null ? do something : task2 == null ? do something : task3 != null ? do something : task4 != null ? do something : null;
...