检查三个标志的所有可能组合的最有效逻辑是什么?

时间:2014-06-23 12:56:54

标签: if-statement switch-statement logic control-flow

我有三个标志,可能是真或假。我需要为每个可能的标志组合显示一个图标。由于有三个标志意味着组合起来有八种可能的状态。 (如下所示,粗体表示真实。)

A B C

A B C

B C

A B C

A B C

A B C

B C

A B C

是否有一个有利的控制流程用于检查标志以最大限度地减少不必要的检查? (这会因可能开启或关闭哪些标志而有所不同?)


修改:

例如,当我只看标志A和B时,我的控制流程是 -

if(A & B) 
{
    // Display icon for A+B 
}
else if (A) 
{
    // Display icon for A 
} 
else if (B)
{
    // Display icon for B 
} 

2 个答案:

答案 0 :(得分:2)

我会设置一个8位变量,允许位2,1,0存储您的标志状态。

然后

switch(variablename)
{
  case 0:

  break;

  ..
  ..

  case 7:

  break;
}    

答案 1 :(得分:0)

protected void grdDemo_ItemDataBound(object sender, GridItemEventArgs e)
{
    if (!(e.Item is GridDataItem) || (e.Item.DataItem == null))
    {
        return;
    }

    ///////////////////
    //// Solution 1 ///
    ///////////////////

    // If it is possible to manipulate image name
    MyClass M1 = e.Item.DataItem as MyClass;
    ImageButton imgStatus = (ImageButton)e.Item.FindControl("imgStatus");

    StringBuilder sb = new StringBuilder();

    sb.Append(M1.A ? "1" : "0");
    sb.Append(M1.B ? "1" : "0");
    sb.Append(M1.C ? "1" : "0");

    string ImageName = "imgStaus" + sb.ToString() + ".jpg";
    imgStatus.ImageUrl = "~/path/" + ImageName;


    ///////////////////
    //// Solution 2 ///
    ///////////////////

    ImageName = string.Empty;

    double FlagCount = 0;
    FlagCount += Math.Pow((M1.A ? 0 : 1) * 2, 3);
    FlagCount += Math.Pow((M1.B ? 0 : 1) * 2, 2);
    FlagCount += Math.Pow((M1.B ? 0 : 1) * 2, 1);
    var intFlagCount = (int)FlagCount;

    switch (intFlagCount)
    {
        case 0:
            ImageName = "imgStausFFF.jpg";
            break;
        case 1:
            ImageName = "imgStausFFT.jpg";
            break;
        case 2:
            ImageName = "imgStausFTF.jpg";
            break;
        case 3:
            ImageName = "imgStausFTT.jpg";
            break;
        case 4:
            ImageName = "imgStausTFF.jpg";
            break;
        case 5:
            ImageName = "imgStausTFT.jpg";
            break;
        case 6:
            ImageName = "imgStausTTF.jpg";
            break;
        case 7:
            ImageName = "imgStausTTT.jpg";
            break;
    }

    imgStatus.ImageUrl = "~/path/" + ImageName;

    //////DONE!!!!!!!!!!

}

class MyClass
{
    public bool A { get; set; }
    public bool B { get; set; }
    public bool C { get; set; }
}