缩短带有大量||的if语句运营商

时间:2016-02-01 19:07:30

标签: c# unity3d

有没有办法if,所以我不必做很多||次操作?

那么无论如何要缩短它以便于阅读?

if(t.triggerOn == TriggerOn.CreationDelay || t.triggerOn == TriggerOn.CollisionDelay || t.triggerOn == TriggerOn.RigidbodyRestDelay || t.triggerOn == TriggerOn.LayerCollisionDelay || t.triggerOn == TriggerOn.EnterRadiusDelay){
    // Do something
}

TriggerOnenum

5 个答案:

答案 0 :(得分:2)

如果您真的想减少字符数,可以使用枚举值的索引。例如:

this.dataset

其中0,1等必须与您想要的TriggerOn值的索引相对应。这样做的缺点是,通过查看这条线很难分辨出你接受的条件。

也就是说,为了便于阅读,您还可以将原始代码分成多行。

    if(t.triggerOn == 0 || t.triggerOn == 1 || t.triggerOn == 2 /* ... */)
    {
        // Do something
    }

我建议保持你的代码不变(可能会把它分成多行),因为可理解性是可读性。

可理解性...嗯......

无论如何,我希望有所帮助!

答案 1 :(得分:1)

我相信在这种情况下,为了便于阅读,您可能需要考虑一个switch语句。

switch (caseSwitch)
{
    case TriggerOn.CreationDelay:
        //do some stuff
        break;
    case TriggerOn.CollisionDelay:
        //do more stuff
        break;
    default:
        //do some more stuff
        break;
}

或一个决定的多个案例

switch (value)
{
   case TriggerOn.CreationDelay:
   case TriggerOn.CollisionDelay:
   case TriggerOn.RigidbodyRestDelay:
      //do some stuff
      break;
   case TriggerOn.LayerCollisionDelay:
   case TriggerOn.EnterRadiusDelay:
      //do more stuff
      break;
   default:
       //default stuff
      break;
}

答案 2 :(得分:1)

这样的事情可以起作用......如果你检查所有的延误。

var _delaylist = TriggerOn.GetType().GetProperties().Where(x => x.Name.Contains("Delay"));

if (_delaylist.Any(x => x.GetValue(x) == t.TriggerOn)
{
    //dowork
}

答案 3 :(得分:0)

我确实创建了一个IN方法,您可以搜索枚举,但它并没有真正节省太多空间。

public static class Search<T> {
    public static bool IN(T val, params T[] items){
        foreach (T item in items) {
            if(val.Equals(item)){
                return true;
            }
        }
        return false;
    }
}

它被这样使用:

if(Search<TriggerOn>.IN(t.triggerOn, TriggerOn.LayerCollision, TriggerOn.EnterRadius...)){
    // Do something
}

答案 4 :(得分:0)

如果您可以控制枚举,那么使用属性进行装饰可以提供良好的可读性并将元数据与代码分开。例如:

public enum TriggerOn
{
    [DelayedTrigger]
    CreationDelay,

    NoCreation,

    [DelayedTrigger]
    CollisionDelay,

    CollisionStandard,

    [DelayedTrigger]
    RigidbodyRestDelay,

    [DelayedTrigger]
    LayerCollisionDelay,

    [DelayedTrigger]
    EnterRadiusDelay
}

public class DelayedTriggerAttribute : Attribute
{

}

然后,您可以重新编写代码,以使用一个很好的扩展方法来测试属性,例如:

t.triggerOn.IsDelayedTrigger()