【问题标题】:How to handle multiple input combinations in a convenient way in C#如何在 C# 中以方便的方式处理多个输入组合
【发布时间】:2014-04-04 18:06:30
【问题描述】:

我有 4 个布尔参数,用于清理使用 Nport 从刻度获得的字符串。我必须在框架 3.5 VS 2008 中执行此操作。

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

  • 真真真真真假
  • 真真真假
  • 真真假真
  • 真真假假
  • 真假真真
  • 真假真假
  • 真假假真
  • 真假假假
  • 假真真真假
  • 假真真假
  • 假真假真
  • 假真假假
  • 假假真真
  • 假假真假
  • 假假假真
  • 假假假假

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

但是,如果不编写许多相互交织的 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);
        }
    }

这是我用来打印的代码。

但我需要这些情况,并且使用 if else 结构将永远花费并且根本不灵活。 有人知道怎么做吗?

【问题讨论】:

  • 为什么不直接将布尔数组传递给 strig.format,它接受一个对象 []。但也许我理解不正确,这不是你想要的。
  • 我会检查这个。作为我需要的示例,如果 startchar=3 和 stopchar=2 已填写,而其他 2 个为空,我可以说。我有真,假,假,真。然后将子字符串从 startchar 带到 stopchar。

标签: c# .net-3.5


【解决方案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 个变量合并为单个案例,然后寻找重叠。
  • 16 个中有 12 个是可能的。并且有一些重叠,但我认为没有办法紧凑。如果填写了 startchar,我必须从字符串的开头剪切值的 nr,例如 3 如果填写了 stop char,我必须剪切最后一部分。如果填充了 startchar 和 valuelength,那么我需要剪切字符串的第一部分并获得 valuelenght 中定义的字符串的确切长度。等等。感谢您的帮助
【解决方案2】:
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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多