处理C#中If语句的排列

时间:2015-01-26 11:47:25

标签: c# if-statement permutation

我有一些存储值的列表。现在我想创建If-Statements来处理这个问题,但这很多。例如:

 if(list1.Count==0 && list2.Count==0)
 {
 //do something
 } 
 if(list1.Count==0 && list3.Count==0)
 {
 //do something
 }
 if(list1.Count==0 && list2.Count==0 && list3.Count==0)
 {
 //do something
 }

如果我有大约10个列表,那么会有大量的if语句。有没有更好的方法来处理?我还没找到任何有用的东西。 谢谢!

2 个答案:

答案 0 :(得分:2)

我可以给出建议的方法之一是看到粘贴在这里的代码是你有一些像这样的重复的东西

               if(list1.Count==0 && list2.Count==0)

然后

              if(list1.Count==0 && list2.Count==0 && list3.Count==0)

其中一个建议是计算这样的条件

              bool onetwo =  list1.Count==0 && list2.Count==0;
              bool thirdalone = list3.Count == 0;

现在代码可以像这样更好

               if(onetwo){
               }
               if(onetwo && thirdalone){
               }

如果您希望可以使用Bitmasking生成所有这些,例如,这里n是我们的总列表。

             bool[] statu = new bool[1 << n];        

             for(int i = 1 ; i < (1<< n) ; i++){
                  bool result = true;                  
                  for(int j = 0 ; j < 32 ; j++){
                    if(i & ( 1 << j) > 0){
                        //this position is part of set
                         if(list[j].count == 0)
                                  result = false;
                     }
                 }
                 status[i] = result;
             }

但它只是更加语义化的方式,没有什么可以提升性能等。

答案 1 :(得分:0)

如果您需要检查每个排列,您可以执行以下操作:

bool b1 = ( list1.count == 0 );
bool b2 = ( list2.count == 0 );
bool b3 = ( list3.count == 0 );
bool b4 = ( list4.count == 0 );
// etc etc

BitArray arr = new BitArray(new bool[4] { b1, b2, b3, b4 });
byte[] bits = new byte[4];
arr.CopyTo(bits, 0);
int x = BitConverter.ToInt32(bits, 0);

switch (x)
{
   case 1: // only list 1 is empty
   case 2: // only list 2 is empty
   case 3: // only list 1 and list 2 are empty
   case x: // and so on.
}

我不会说它是否更具可读性,但我宁愿维持这样的未来而不是巨大的if / else / else if block。