我每组有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完成以获得最终状态。
答案 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)
我会是你,我会坚持Tuple<bool, bool, bool>
并嵌套for(var i = 0; i < 2; i++)
个周期(n个参数需要n个周期)。
然后我会提供一个Tuple<Predicate<Tuple<bool, bool, bool>>, Action>
列表,它将谓词与回调配对,当谓词等于true时应该触发。
Linq可以实现休息。类似possibleCombinationsList.Select(tripleOfBooleans => predicatesAndCallbacksList.Single(predicateAndCallback => predicateAndCallback.Item1(tripleOfBooleans) == true)).Sinle().Item2();
玩得开心。