没有任何结果的 if 语句中的三元运算符
Ternary operator inside an if-statement that results in nothing
好吧,我可能做错了,但我似乎找不到好的解决方案,所以任何指示都会有所帮助。我的代码中有以下语句:
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
,那不是死胡同。
你可以重写
((mapOpenings.Count < 4)) ? !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend) : *ignore this section*)
作为
((mapOpenings.Count < 4) || !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend))
下面的代码既回答了问题又重构了您的代码,易读性部门迫切需要改进(正如许多人在评论中指出的那样)。
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;
好吧,我可能做错了,但我似乎找不到好的解决方案,所以任何指示都会有所帮助。我的代码中有以下语句:
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
,那不是死胡同。
你可以重写
((mapOpenings.Count < 4)) ? !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend) : *ignore this section*)
作为
((mapOpenings.Count < 4) || !room._flags.IsFlagSet(GlobalValues.MapTileType.deadend))
下面的代码既回答了问题又重构了您的代码,易读性部门迫切需要改进(正如许多人在评论中指出的那样)。
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;