2016-10-27 3 views
4

Как это реализовать с помощью тернарного оператора?Условие в условном (тройном) операторе

if(UnitType == null) 
{ 
    a = ElevationType 
} 
else 
{ 
    a = UnitType 
} 

троичный оператор

a = UnitType == null ? ElevationType : UnitType; 

Теперь я хочу что-то вроде этого

if(UnitType == null) 
{ 
    if(ElevationType == null) 
    { 
    a = StructureType 
    } 
    else{ 
    a = ElevationType 
    } 
} 
else 
{ 
    a = UnitType 
} 

Могу ли я достичь этого, используя тройной оператор? Если нет, что делать?

+0

Вы можете достичь этого, но это будет немного трудно читать. Есть ли причина, почему структура if-else неприемлема? –

+0

палочка с если еще структура. Читаемость важна. – Sak

+0

Не пытайтесь использовать тройной. Это редко получается хорошо. – Carcigenicate

ответ

9
a = (UnitType == null) ? (ElevationType ?? StructureType) : UnitType; 

Но я поддерживаю свой комментарий: это труднее понять, чем если бы-то было бы.

Или, возможно,

a = UnitType ?? ElevationType ?? StructureType; 

Это достаточно ясно, если вы знакомы с оператором ??.

+0

Не могли бы вы рассказать, как мы будем оценивать оператор '??' оператора? –

+3

@zariakhan [Здесь вы идете] (https://msdn.microsoft.com/en-us/library/ms173224.aspx) - или если вы не хотите его читать, в этом случае a равно ' UnitType', если он не равен null, и в этом случае он принимает значение 'ElevationType', если это тоже не так, и в этом случае он, наконец, принимает значение' StructureType' –

+0

@AlfieGoodacre Cool. Не был знаком с этим оператором. Спасибо за такое легкое объяснение! –

1

Просто напишите отдельный метод и не используйте вложенные операторы ?, потому что это боль для всех (нечитабельно, подскажите об ошибках). Что, если завтра ваш тип будет расширяться с помощью еще двух типов, ваш оператор Ternary станет адским.

public TypeOfA GetTypeOfAMethod() 
{ 
    if(UnitType != null) 
     return UnitType; 

    if(ElevationType != null) 
     return ElevationType; 

    if(StructureType != null) 
     return StructureType 

    return null; 

} 
3

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

a = UnitType == null ? 
    (ElevationType == null ? 
     StructureType 
     : ElevationType) 
    : UnitType; 

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

a = UnitType == null ? 
    (ElevationType ?? StructureType) 
    : UnitType;