编辑:
我有三个标志,可以是True或False。我需要显示每个可能的旗帜组合的图标。因为有三个标志,这意味着,组合起来,有八种可能的状态。(如下所示,其中粗体表示true。)
A B C
A B C
A B CA B C
A C
A B CA 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
}
我会设置一个8位的变量,允许第2,1,0位存储你的旗帜状态。
然后switch(variablename)
{
case 0:
break;
..
..
case 7:
break;
}
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; }
}