C# 将switch语句重构为enum
我想清理我的代码,使它更简单。现在我有了一个返回和int值的方法C# 将switch语句重构为enum,c#,enums,C#,Enums,我想清理我的代码,使它更简单。现在我有了一个返回和int值的方法 private int ReturnMyValue(string line) { switch (line) { case "ST": return 1; case "KG": return 2; case "M": return 3; case "M2":
private int ReturnMyValue(string line)
{
switch (line)
{
case "ST":
return 1;
case "KG":
return 2;
case "M":
return 3;
case "M2":
return 4;
(...)
}
}
在此之前,我从一个文件中读取了一个字符串数组,所以看起来像这样:
var myString = "";
var splittedString = myString.Split('|');
var iWantThatValue = ReturnMyValue(splitted[0]);
private enum Value
{
ST = 1,
KG = 2
}
有没有一种方法可以创建这样的枚举:
var myString = "";
var splittedString = myString.Split('|');
var iWantThatValue = ReturnMyValue(splitted[0]);
private enum Value
{
ST = 1,
KG = 2
}
以某种方式摆脱这种方法
当splited[0]
等于“ST”时,我希望我的I希望该值
为1 使用Enum.TryParse
if(Enum.TryParse(拆分[0],out-var-iWantThatValue)){…}
使用Enum.TryParse
if(Enum.TryParse(拆分[0],out-var-iWantThatValue)){…}
我不确定Enum是否是这里的正确工具。枚举数是编译时常量。如果您想要在运行时不会更改的内容,readonly是另一个选项。我的意思是,如果您需要对这些(用户输入)字符串进行本地化,该怎么办?如果希望在每次加载时更改可能的值,该怎么办?枚举数不能支持这一点
通常我更喜欢用集合替换switch/case语句。对于您的特定情况,字符串[]就足够了:您使用行作为值,使用返回值作为索引。但是你可以更喜欢字典之类的东西
您的案例很难确定,因为我们不知道周围的需求。我不确定Enum是否是这里的正确工具。枚举数是编译时常量。如果您想要在运行时不会更改的内容,readonly是另一个选项。我的意思是,如果您需要对这些(用户输入)字符串进行本地化,该怎么办?如果希望在每次加载时更改可能的值,该怎么办?枚举数不能支持这一点 通常我更喜欢用集合替换switch/case语句。对于您的特定情况,字符串[]就足够了:您使用行作为值,使用返回值作为索引。但是你可以更喜欢字典之类的东西
您的案例很难确定,因为我们不知道周围的要求。您可以将字符串解析为枚举,例如
public enum Value
{
ST = 1, // start at 1
KG,
M,
M2
}
var value = (Value)Enum.Parse(typeof(Value), "KG");
要得到整数值
var intValue = (int)val;
您可以将字符串解析为枚举,例如
public enum Value
{
ST = 1, // start at 1
KG,
M,
M2
}
var value = (Value)Enum.Parse(typeof(Value), "KG");
要得到整数值
var intValue = (int)val;
可以使用convert.ToInt32将枚举转换为Int 例如:
可以使用convert.ToInt32将枚举转换为Int 例如:
您的方法可以归结为:
private int ReturnMyValue(string line)
{
return intValue.ContainsKey(line)
? intValue[line]
: -1; //Or any other default value
}
通过使用字典/哈希映射
将开关案例转换为intValue
映射中的条目:
{
{"ST", 1},
{"KG", 2},
.
.
}
您的方法可以归结为:
private int ReturnMyValue(string line)
{
return intValue.ContainsKey(line)
? intValue[line]
: -1; //Or any other default value
}
通过使用字典/哈希映射
将开关案例转换为intValue
映射中的条目:
{
{"ST", 1},
{"KG", 2},
.
.
}
如果您可以稍微更改一下设计,Enum.Parse可能是一个很好的解决方案
[Flags]
枚举,其值为二次幂(0x01
,0x02
,0x04
,等等)|
)更改为使用逗号(,
)[Flags]
public enum Value
{
ST = 0x01,
KG = 0x02,
M = 0x04,
M2 = 0x08,
//etc
}
然后:
const string valueChoices = "ST,M2";
Value values = (Value) Enum.Parse(typeof(Value), valueChoices);
Debug.WriteLine(values);
如果您查看上面的
值的值,它将是ST | M2
,或者,作为int:9
。如果您查看输出窗口,您将看到:ST,M2
如果您可以稍微更改一下设计,Enum.Parse可能是一个很好的解决方案
将枚举更改为[Flags]
枚举,其值为二次幂(0x01
,0x02
,0x04
,等等)
将字符串从使用管道字符(|
)更改为使用逗号(,
)
代码最终是:
[Flags]
public enum Value
{
ST = 0x01,
KG = 0x02,
M = 0x04,
M2 = 0x08,
//etc
}
然后:
const string valueChoices = "ST,M2";
Value values = (Value) Enum.Parse(typeof(Value), valueChoices);
Debug.WriteLine(values);
如果您查看上面的值的值,它将是ST | M2
,或者,作为int:9
。如果在输出窗口中查看,您将看到:ST,M2
这看起来像是一个字典的作业,而不是枚举。enum.Parse
,然后强制转换为int
。但最好使用地图(字典)。看,这看起来像是一个字典的作业,而不是枚举。enum.Parse
,然后强制转换为int
。但最好使用地图(字典)。参见