2016-07-09 5 views
0

Хорошо, я, вероятно, все это неправильно, но я не могу найти подходящее решение, поэтому любые указатели помогут. У меня есть следующее заявление в своем коде:Тернарный оператор внутри оператора if, который ничего не приводит

if (!mapDict.ContainsKey(_thisRoom.Item1)) 
     { 

      MapGraphItem roomMGI = new MapGraphItem(); 


      var rndOrderRooms = roomList.OrderBy(i => rnd.Next()); 
      foreach (MapGraphItem room in rndOrderRooms) 
      { 
       if (!room._flags.IsFlagSet(GlobalValues.MapTileType.start) && !room._flags.IsFlagSet(GlobalValues.MapTileType.exit) 
        && ((_thisRoom.Item2 == 'N') ? room._north : (_thisRoom.Item2 == 'S') ? room._south : (_thisRoom.Item2 == 'E') ? room._east : room._west) 
        && ((mapOpenings.Count < 4) : !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend) ? *ignore this section*)) 
       { 
        roomMGI = room; 
        earlyRooms.Add(room); 
        goto Exit; 
       } 
      } 

      Exit: 
      //MapGraphItem _room = earlyRooms[rnd.Next(0, earlyRooms.Count)]; 

      GameObject _roomGO = (GameObject)Instantiate(roomMGI.gameObject, _thisRoom.Item1, Quaternion.identity); 
      roomMGI._position = GlobalValues.MapTilePos.Early; 
      mapDict.Add(_roomGO.transform.position, roomMGI); 

      _mapUsed++; 

      if (roomMGI._north) _n = true; 
      if (roomMGI._south) _s = true; 
      if (roomMGI._east) _e = true; 
      if (roomMGI._west) _w = true; 

      Debug.Log ("Early room added at: " + _thisRoom.Item1.ToString() + " N? " + (_n ? "yes" : "no") + " S? " + (_s ? "yes" : "no") + 
       " E? " + (_e ? "yes" : "no") + " W? " + (_w ? "yes" : "no")); 

      GetRoomOpenings(_roomGO.transform.position, _n, _s, _e, _w); 

      _tiles--; 
     } 

В основном, *ignore this section* области означает, что я хочу, ничего не произойдет.

Иными словами, если первые две строки if являются правильными, если .Count меньше четырех, есть дополнительное условие. Если .Count четыре или более, это условие не требуется.

Я не могу установить его на противоположное, только room._flags.IsFlagSet(GlobalValues.MapTileType.deadend), потому что я не хочу, чтобы его заставили быть тупиком. Я просто хочу убедиться, что это НЕ тупик, если осталось меньше четырех mapOpening.

+0

Получаете ли вы приз за использование самых тройных операторов в одном заявлении? Потому что я не могу думать ни о какой другой убедительной причине, почему вы не сломаете часть этого на вложенные ifs. –

+0

Вопрос: какой результат этой программы имеет окончательный ответ - вывод заключается в том, что разработчик, который его написал, уволен. – Stilgar

+0

Поскольку читаемость if {if {if {if ...} ...} ...} ...} не является хорошей? Я могу легко прокомментировать каждый раздел одного оператора if. И потому, что получившееся тело - это один набор вещей или ничего вообще. –

ответ

2

Вы можете переписать

((mapOpenings.Count < 4)) ? !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend) : *ignore this section*) 

в

((mapOpenings.Count < 4) || !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend)) 
+0

Gah, я знал, что мне не хватает чего-то простого. Спасибо, @ Dandré! –

+0

Ах, это не сработало ... но оно работает как '||' like '&& ((mapOpening.Count> 4) ||! Room._flags.IsFlagSet (GlbalValues.MapTileType.deadend))' –

+0

Извини, я виноват. Спасибо за предложение. –

0

Код ниже и отвечает на вопрос и refactors ваш код, который отчаянно нуждается в совершенствовании в отделе разборчивости (как отмечено многими люди в комментариях).

if (room._flags.IsFlagSet(GlobalValues.MapTileType.start) { 
return; 
} 

if (room._flags.IsFlagSet(GlobalValues.MapTileType.exit) { 
return; 
} 

bool dirFlag = false; 
if (_thisRoom.Item2 == 'N') { 
dirFlag = room._north; 
}else if (_thisRoom.Item2 == 'S') { 
dirFlag = room._south; 
}else if (_thisRoom.Item2 == 'E') { 
dirFlag = room._east; 
}else { 
dirFlag = room._west; 
} 

if (!dirFlag) { 
return; 
} 

if (mapOpenings.Count < 4 && room._flags.IsFlagSet(GlobalValues.MapTileType.deadend)) { 
return; 
} 

roomMGI = room; 
earlyRooms.Add(room); 
goto Exit; 
+0

Я добавил больше кода, чтобы показать, почему это не вариант. Я не могу просто «вернуть». Он должен всегда попадать внутрь инструкции if, и один из элементов в rndOrderRooms всегда будет соответствовать всем необходимым критериям. Но критерии меняются каждый раз, и порядок rndOrderRooms, ну, рандомизирован, так что несколько возможных совпадений не всегда выбираются с одинаковым приоритетом. –

+0

@JesseWilliams Вы можете просто сделать мой код блоком метод, вызвать метод, а затем его штраф, чтобы вернуться из него, - что делает ТОЧНУЮ ТОЛЬКО вещь, не входящую в блок if. – nhouser9

+0

@JesseWilliams При необходимости вы можете заставить метод возвращать логическое значение, указывающее, следует ли переходить на GOTO (которого вы также не должны использовать, но это другая проблема) – nhouser9

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

  • Нет связанных вопросов^_^