我有一段代码使用嵌套循环创建一个linq表达式,该表达式比较对象Paint中每个bool组合的可能性。它完美地工作,但如果我想继续添加属性到Paint,我将不得不继续添加for循环到流程。我想将其转换为使用递归,但我遇到了麻烦。任何人都可以为此提供一些见解/起点吗?将问题转换为使用递归
ParameterExpression param = Expression.Parameter(typeof(Paint), "t");
Expression exp = null;
object f = false;
object t = true;
List<Expression> expList = new List<Expression>();
//Properties to compare
MemberExpression memberA = Expression.Property(param, "BoolA");
MemberExpression memberB = Expression.Property(param, "BoolB");
MemberExpression memberC = Expression.Property(param, "BoolC");
MemberExpression memberD = Expression.Property(param, "BoolD");
//Loop 3 times to create expression using BoolA == true, BoolA == false, do not use BoolA
for(int aa = 0; aa <= 2; aa++)
{
Expression aExp = null;
if (aa == 0)
{
aExp = Expression.Equal(memberA, Expression.Constant(f));
expList.Add(aExp);
}
if(aa == 1)
{
aExp = Expression.Equal(memberA, Expression.Constant(t));
expList.Add(aExp);
}
for (int bb = 0; bb <= 2; bb++)
{
Expression bExp = null;
if (bb == 0)
{
bExp = Expression.Equal(memberB, Expression.Constant(f));
expList.Add(bExp);
}
if (bb == 1)
{
bExp = Expression.Equal(memberB, Expression.Constant(t));
expList.Add(bExp);
}
for(int cc = 0; cc <= 2; cc++)
{
Expression cExp = null;
if (cc == 0)
{
cExp = Expression.Equal(memberC, Expression.Constant(f));
expList.Add(cExp);
}
if(cc == 1)
{
cExp = Expression.Equal(memberC, Expression.Constant(t));
expList.Add(cExp);
}
for (int dd = 0; dd <= 2; dd++)
{
Expression dExp = null;
if (dd == 0)
{
dExp = Expression.Equal(membeDr, Expression.Constant(f));
expList.Add(dExp);
}
if (dd == 1)
{
dExp = Expression.Equal(memberD, Expression.Constant(t));
expList.Add(dExp);
}
//Process expList
//remove expression to prepare to add its opposite in its place
expList.Remove(dExp);
}
expList.Remove(cExp);
}
expList.Remove(bExp);
}
expList.Remove(aExp);
}
你不需要递归来实现这一点,也不需要嵌套循环。不幸的是,这个问题已经结束了,因为我认为这个问题很清楚,根本不宽泛,并且很容易回答。 –
@PeterDuniho对于一个解决方案,你会提出什么建议,以便我可以研究它? – Mike
在评论中很难解释,但基本思想是:维护一个计数器(如果你有32个或更少的属性,计数器可以简单地是一个'int')。从0开始,检查计数器中的每一位,以查看表达式是否应为“true”或“false”来构建要处理的表达式列表。处理后,清除列表,增加计数器,然后重新执行。继续,直到计数器的值为0x01 << count',其中'count'是您正在处理的属性数。将属性表达式保留在一个数组中,以便知道哪一个属于哪个位。 –