我每组有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完成以获得最终状态。
我的第一个想法是至少先测试第一组条件,然后测试第二组条件。虽然这不是避免编写所有九个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) { }
}
我会是你,我会坚持Tuple<bool, bool, bool>
和嵌套for(var i = 0; i < 2; i++)
周期(n个参数需要n个周期)。
Tuple<Predicate<Tuple<bool, bool, bool>>, Action>
列表,它将谓词与回调配对,当谓词等于true时应该触发。possibleCombinationsList.Select(tripleOfBooleans => predicatesAndCallbacksList.Single(predicateAndCallback => predicateAndCallback.Item1(tripleOfBooleans) == true)).Sinle().Item2();
玩得开心。
这是使用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;
}
祝好运。