条件陈述的组合

时间:2017-12-25 17:48:28

标签: c# unity3d conditional

我每组有2组3个条件。 设a,b,c为一组条件,x,y,z为另一组。我需要评估以下

if(a && x)
..... 
else if(a && y) 
..... 
else if(a && z)
.....

同样地,3个条件用b和3个用c。

在不编写所有组合的情况下评估条件的最佳方法是什么?

更新:

我在Unity制作游戏。条件a,b,c检查玩家的 x 位置是否在一定范围内与球的位置和条件x,y,z相比是否相同 y 位置。基于正确的条件(来自组合ax,ay,az,bx,by,bz,cx,cy,cz),选择一个动画状态(9个中的一个)。因此每种情况都会产生不同的结果。

更新: 我最终制作了两个函数来评估两组条件,每个函数返回一个枚举,按位OR完成以获得最终状态。

3 个答案:

答案 0 :(得分:2)

我的第一个想法是至少先测试第一组条件,然后测试第二组条件。虽然这不是一个避免编写所有九个if语句的答案,但你平均会减少if语句的数量。

if (a) 
{
    if (x) { }
    else if (y) { }
    else if (z) { }
}
else if (b)
{
    if (x) { }
    else if (y) { }
    else if (z) { }
}
else if (c)
{
    if (x) { }
    else if (y) { }
    else if (z) { }
}

答案 1 :(得分:1)

这是使用Linq表达式执行此操作的一种方法,Linq表达式是一种动态定义表达式的方法,您可以对它们执行多个操作。我在这里使用了一个假的条件表达式,它只是为了演示而将一个数字作为参数。首先在方法中或直接在您的代码中定义每个条件。然后将所有这些放入数组中,每个条件设置为一个数组。然后是两个执行表达式的foreach。

218

为方法中的每个条件定义表达式,例如:

int num = 20;

        ConditionalExpression[] firstSet = { ExpressionA(num), ExpressionB(num), ExpressionC(num) };
        ConditionalExpression[] secondSet = { ExpressionX(num), ExpressionY(num), ExpressionZ(num) };

        foreach(var firstSetExpression in firstSet)
            foreach (var secondSetExpression in secondSet)
            {
                var result1 = Expression.Lambda<Func<bool>>(firstSetExpression.Test).Compile();
                var result2 = Expression.Lambda<Func<bool>>(secondSetExpression.Test).Compile();

                if (result1.Invoke() && result2.Invoke())
                { 
                    // do your thing here 
                }
            }

甚至可以通过多种方式对其进行优化,但这只是为了让您入门。

更新:这是谁不想在运行时编译的另一种方式。使用代表:

private static ConditionalExpression ExpressionA(int num)
        {
             return Expression.Condition(
                          Expression.Constant(num > 10),
                          Expression.Constant("num is greater than 10"),
                          Expression.Constant("num is smaller than 10")
                        );
        }

祝你好运。

答案 2 :(得分:1)

  1. 生成所有可能的组合。由于你处理布尔,每个给你2个选项。然后,2个bool的最简单可能的组合产生2×2 = 4个组合。一般来说,K = 2 ^ n,其中n代表你处理的布尔数。
  2. 我会是你,我会坚持Tuple<bool, bool, bool>并嵌套for(var i = 0; i < 2; i++)个周期(n个参数需要n个周期)。

    1. 然后我会提供一个Tuple<Predicate<Tuple<bool, bool, bool>>, Action>列表,它将谓词与回调配对,当谓词等于true时应该触发。

    2. Linq可以实现休息。类似possibleCombinationsList.Select(tripleOfBooleans => predicatesAndCallbacksList.Single(predicateAndCallback => predicateAndCallback.Item1(tripleOfBooleans) == true)).Sinle().Item2();

    3. 的东西

      玩得开心。