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