Какая наиболее эффективная логика для проверки всех возможных комбинаций трех флагов?

#if-statement #switch-statement #logic #control-flow

#if-statement #switch-statement #Логические #поток управления

Вопрос:

У меня есть три флага, которые могут быть True или False. Мне нужно отобразить значок для каждой возможной комбинации флагов. Поскольку существует три флага, это означает, что в комбинации существует восемь возможных состояний. (Показано ниже, где жирный шрифт обозначает true .)

A B C

A B C

A B C

A B C

A B C

A B C

A B C

A B C

Существует ли выгодный поток управления для проверки флагов, чтобы свести к минимуму ненужную проверку? (Будет ли это зависеть от того, какие флаги могут быть включены или выключены?)


Редактировать:

Например, когда я смотрел на простые флаги A и B, мой поток управления был —

 if(A amp; B) 
{
    // Display icon for A B 
}
else if (A) 
{
    // Display icon for A 
} 
else if (B)
{
    // Display icon for B 
} 
  

Комментарии:

1. (Если есть проблема с этим вопросом, пожалуйста, дайте мне знать, и я постараюсь ее улучшить.)

Ответ №1:

Я бы установил 8-битную переменную, позволяющую битам 2,1,0 хранить ваши состояния флага.

Затем

 switch(variablename)
{
  case 0:

  break;

  ..
  ..

  case 7:

  break;
}    
  

Ответ №2:

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