如何在C#中以方便的方式处理多个输入组合

时间:2014-04-04 08:44:05

标签: c# .net-3.5

我有4个布尔参数,用于清理我使用Nport从比例中获得的字符串。我必须在框架3.5 VS 2008中这样做。

我有16种可能的输入组合:

  • true true true true
  • true true true false
  • true true false true
  • true true false false
  • true false true true
  • true false true false
  • true false false true
  • true false false false
  • false true true true
  • false true true false
  • false true false true
  • false true false false
  • false false true true
  • false false true false
  • false false false true
  • false false false false

对于每种情况,我必须对我给该方法的字符串执行不同的操作。

但是,如果不编写许多交织在一起的ifelse条款,我该怎么办呢? 我可以在屏幕上打印出来,但根据我的说法,转换是不可能的,框架3.5中还没有元组。

public void CompositionBooleans(string result, int counter)
        {
            if (counter == 0)
                return;

            bool[] booleans = new bool[2] { true, false };

             for (int j = 0; j < 2; j++)
            {
                StringBuilder stringBuilder = new StringBuilder(result);
                stringBuilder.Append(string.Format("{0} ", booleans[j].ToString())).ToString();

            if (counter == 1)
                Console.WriteLine(stringBuilder.ToString());

            CompositionBooleans(stringBuilder.ToString(), counter - 1);
        }
    }

这是我用来打印出来的代码。

但我需要这些情况,并且如果其他结构将永远需要,并且根本不灵活。 有人知道怎么做吗?

2 个答案:

答案 0 :(得分:1)

如果你真的有16个可能的组合中的每一个都有一个不同的过程,我建议将布尔数组转换成一个int并打开那个int:

int i = booleans[0]?1:0 
      + 2*(booleans[1]?1:0)
      + 4*(booleans[2]?1:0)
      + 8*(booleans[3]?1:0);

switch (i)
{
   case 0: //false false false false
   case 1: //true false false false
   case 2: //false true false false
   //...
   case 15: //true true true true
}

但你确定每种情况都完全不同,而不仅仅是4个方面的组合吗?

答案 1 :(得分:0)

public static void main(String[] args)
{
    boolean[] items = new boolean[] {true, true, true, true};
    int actionIndex = getActionIndex(0, 0, items);
              //do your action here: you could store lambda expressions and apply them
    System.out.write(actionIndex);
}

public static int getActionIndex(int currentItem, int currentIndex, boolean[] items)
{
    if(currentItem == items.length)
    {
        return currentIndex;
    }

    if(items[currentItem])
    {
        currentIndex += Math.pow(2, (items.length - 1) - currentItem);
    }

    return getActionIndex(++currentItem, currentIndex, items);
}