我有一段代碼使用嵌套循環創建一個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'是您正在處理的屬性數。將屬性表達式保留在一個數組中,以便知道哪一個屬於哪個位。 –