条件陈述的组合

问题描述 投票:0回答:3

我每组有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完成以获得最终状态。

c# unity3d conditional
3个回答
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. 生成所有可能的组合。由于你处理布尔,每个给你2个选项。然后,2个bool的最简单可能的组合产生2×2 = 4个组合。一般来说,K = 2 ^ n,其中n表示您处理的布尔数。

我会是你,我会坚持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();

玩得开心。


1
投票

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

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")
                        );
        }

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

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

Func<int, bool>[] firstSet = new Func<int,bool> [] { ExpressionA(), ExpressionA(), ExpressionA() };
            Func<int, bool>[] secondSet = new Func<int, bool>[] { ExpressionA(), ExpressionA(), ExpressionA() };

            foreach(var firstSetExpression in firstSet)
                foreach (var secondSetExpression in secondSet)
                {
                    if (firstSetExpression.Invoke(20) && secondSetExpression.Invoke(20))
                    { 
                        // do your thing here 
                    }
                }
...
...
...

private static Func<int, bool> ExpressionA()
        {
             return (x) => x > 10;
        }

祝好运。

© www.soinside.com 2019 - 2024. All rights reserved.