중첩 루프를 사용하여 오브젝트 페인트에서 bool 조합의 모든 가능성을 비교하는 linq 표현식을 작성하는 코드 조각이 있습니다. 완벽하게 작동하지만 그림판에 속성을 계속 추가하려면 프로세스에 대한 루프를 계속 추가해야합니다. 재귀를 사용하도록 변환하고 싶습니다만, 문제가 있습니다. 누구나이 통찰력/출발점을 제공 할 수 있습니까?재귀를 사용하여 변환하는 데 문제가 있습니다
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'는 다루고있는 속성의 수입니다. 속성 표현식을 배열에 보관하여 어느 것이 어느 비트로 들어가는 지 알 수 있도록하십시오. –