user3497156
user3497156

Reputation: 23

How to handle multiple input combinations in a convenient way in C#

I have 4 Boolean parameters that I use to clean a string that I get from a scale using a Nport. I have to do this in framework 3.5 VS 2008.

I have 16 possible input combinations:

For each situation I have to do a different action on the string that I give to the method.

But how do I do this without writing many intertwined if and else clauses? I can print this out on the screen but according to me a switch is out of the question and a tuple does not exist yet in framework 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);
        }
    }

This is the code I use to print it out.

But I need these situations and doing it with if else structures will take forever and is not flexible at all. Does anybody know how to do this?

Upvotes: 1

Views: 210

Answers (2)

Shadow3097
Shadow3097

Reputation: 28

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);
}

Upvotes: 0

Djizeus
Djizeus

Reputation: 4175

If you really have one different process to do for each of the 16 possible combinations, I would suggest converting the array of Booleans into an int and switch on that 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
}

But are you sure each situation is totally different and not a combination of 4 aspects only?

Upvotes: 1

Related Questions