[英]How to jump to another case statement in a switch-case condition with the value of current case statement using C#
[英]Is there a more efficient way to run enum values through a switch-case statement in C# than this?
我想知道是否有一個更有效(在更簡單/更簡潔的代碼中有效)的方式來制作如下所示的案例陳述......
我有一本字典。 它的關鍵類型是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
您可以只切換標簽,然后在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;
創建一個從枚舉值映射到標簽的哈希表。 然后你可以查找標簽來改變,而不是切換。
在枚舉和需要根據該枚舉值更改的標簽之間創建一個映射。 然后使用當前枚舉值來獲取要更新的相應標簽。
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;
}
首先,您可能希望將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;
}
您可以將案例放在字典中:
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];
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.