我想知道是否有更高效(更简单/更简洁的代码)的方式来制作如下所示的案例陈述......
我有一本字典。它的关键类型是Enum,它的值类型是bool。如果布尔值为true,我想更改表单上标签的颜色。
示例中更改了变量名称。
Dictionary<String, CustomType> testDict = new Dictionary<String, CustomType>();
//populate testDict here...
Dictionary<MyEnum, bool> enumInfo = testDict[someString].GetEnumInfo();
//GetEnumInfo is a function that iterates through a Dictionary<String, CustomType>
//and returns a Dictionary<MyEnum, bool>
foreach (KeyValuePair<MyEnum, bool> kvp in enumInfo)
{
switch (kvp.Key)
{
case MyEnum.Enum1:
if (someDictionary[kvp.Key] == true)
{
Label1.ForeColor = Color.LimeGreen;
}
else
{
Label1.ForeColor = Color.Red;
}
break;
case MyEnum.Enum2:
if (someDictionary[kvp.Key] == true)
{
Label2.ForeColor = Color.LimeGreen;
}
else
{
Label2.ForeColor = Color.Red;
}
break;
}
}
到目前为止,MyEnum有8个不同的值..这意味着我有8个不同的case语句。 我知道必须有一种更简单的方法来做到这一点,我无法在脑海中概念化它。
如果有人可以提供帮助,我会非常感激。我喜欢C#而且我每天都在学习新东西......我像海绵一样吸收它:)
-CP
答案 0 :(得分:7)
您可以切换标签,然后在switch语句后设置颜色:
Label label = null;
switch (kvp.Key)
{
case MyEnum.Enum1:
label = Label1;
break;
case MyEnum.Enum2:
label = Label2;
break;
}
label.ForeColor = kvp.Value ? Color.LimeGreen : Color.Red;
或者,您可以拥有Dictionary<MyEnum, Label>
,并且只需恰当地查找标签:
labelDictionary[kvp.Key].ForeColor = kvp.Value ? Color.LimeGreen : Color.Red;
答案 1 :(得分:2)
创建一个哈希表,从您的枚举值映射到标签。然后你可以查找标签来改变,而不是切换。
答案 2 :(得分:2)
在枚举和需要根据该枚举值更改的标签之间创建一个映射。然后使用当前的枚举值来获取要更新的相应标签。
Dictionary<MyEnum,Label> labelMap = new Dictionary<MyEnum,Label>();
labelMap.Add( MyEnum.Enum1, Label1 );
...
foreach (KeyValuePair<MyEnum, bool> kvp in enumInfo)
{
var label = labelMap[kvp.Key];
label.ForeColor = kvp.Value ? Color.LimeGreen : Color.Red;
}
答案 3 :(得分:1)
首先,您可能希望将case语句的主体合并到一个接受一个或多个参数的函数中。这可能比复制内容更容易。 @Reed在switch语句中选择正确的标签实例的想法也是一个好主意,如果逻辑只在此基础上变化,那么这是一个更好的选择。
您还可以使用?:运算符来简化决策逻辑。
例如:
switch (kvp.Key)
{
case MyEnum.Enum1:
UpdateUI( Label1, someDictionary[kvp.Key] );
break;
case MyEnum.Enum2:
UpdateUI( Label2, someDictionary[kvp.Key] );
break;
case MyEnum.Enum3:
UpdateUI( Label3, someDictionary[kvp.Key] );
break;
}
public void UpdateUI( Label theLabel, bool whichOne )
{
theLabel.ForeColor = whichOne ? Color.LimeGreen : Color.Red;
}
答案 4 :(得分:0)
您可以将案例放在字典中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace ConsoleApplication3
{
class Program
{
private enum MyEnum
{
shwan,
dooo,
sieven,
sieven_haif,
shwenty,
shwenty_doo_haif,
schfifty_faive
}
class EnumInfo
{
public MyEnum Enum;
public bool State;
public override bool Equals(object obj)
{
EnumInfo ei = obj as EnumInfo;
return this.Enum == ei.Enum && this.State == ei.State;
}
public override int GetHashCode()
{
return this.Enum.GetHashCode() ^ this.State.GetHashCode();
}
}
private static IDictionary<EnumInfo, Color> EnumColorDict = new Dictionary<EnumInfo, Color>()
{
{new EnumInfo(){Enum=MyEnum.shwan, State=true},Color.LimeGreen},
{new EnumInfo(){Enum=MyEnum.shwan, State=false},Color.Red},
{new EnumInfo(){Enum=MyEnum.dooo, State=true},Color.LimeGreen},
{new EnumInfo(){Enum=MyEnum.dooo, State=false},Color.Red}
};
static void Main(string[] args)
{
EnumInfo ei = new EnumInfo() { Enum = MyEnum.shwan, State = true };
Color c = EnumColorDict[ei];
}
}
}