我有很长的if else代码
if (errorNumbers.Length == 6)
{
if (errorNumbers.Substring(0,4).Equals("1101") || errorNumbers.Substring(0,4).Equals("2121"))
{
retStr = "AutoRepickAfterPickError";
}
else if (errorNumbers.Substring(0, 4).Equals("1301") || errorNumbers.Substring(0, 4).Equals("2321"))
{
retStr = "AutoRepickAfterLAlignError";
}
else if (errorNumbers.Substring(0, 4).Equals("1401") || errorNumbers.Substring(0, 4).Equals("2221"))
{
retStr = "AutoRepickAfterCAlignError";
}
else if (errorNumbers.Substring(0, 4).Equals("1501") || errorNumbers.Substring(0, 4).Equals("2041"))
{
retStr = "AutoRepicksAfterManualRecovery";
}等等……
我怎么能把它重写成更好的东西。尝试在这里学习一些新的东西,我在.net 2.0中。谢谢你的帮助。
发布于 2011-05-23 17:12:29
我会将错误代码映射到字典中,如下所示:
string errorCode = errorNumbers.Substring(0, 4);
Dictionary<string, string> map = new Dictionary<string,string>();
map.Add("1501", "AutoRepicksAfterManualRecovery");
map.Add("2041", "AutoRepicksAfterManualRecovery");
map.Add("1401", "AutoRepickAfterCAlignError");
map.Add("2221", "AutoRepickAfterCAlignError");
map.Add("1301", "AutoRepickAfterPickError");
map.Add("2121", "AutoRepickAfterPickError");
// etc
if(!map.ContainsKey(errorCode))
throw new Exception("Invalid error code");
return map[errorCode];发布于 2011-05-23 17:10:56
这应该很简单。
if (errorNumbers.Length == 6)
{
string errNo = errorNumbers.Substring(0, 4);
switch (errNo)
{
case "1101":
case "2121":
retStr = "AutoRepickAfterPickError";
break;
case "1301":
case "2321":
retStr = "AutoRepickAfterLAlignError";
break;
case "1401":
case "2221":
retStr = "AutoRepickAfterCAlignError";
break;
case "1501":
case "2041":
retStr = "AutoRepicksAfterManualRecovery";
break;
}
}还要注意,与Java语言不同,在C#中可以用==比较字符串。
"123" == "456"和"123".Equals("456")做同样的事情。
发布于 2011-05-23 17:15:39
首先,DRY Principle - Don't Repeat Yourself。将errorNumbers.Substring(0, 4)的结果赋给一个局部变量:
string subNumbers = errorNumbers.SubString(0, 4);
if (subNumbers == "1401") // ...对特定值情况(非范围)的支持:
可以将switch语句与字符串一起使用:
switch(subNumbers)
{
case "1401":
case "2221":
retStr = "AutoRepickAfterCAlignError";
break;
case "1501":
case "2041":
retStr = "AutoRepicksAfterManualRecovery";
break;
// etc
}switch语句的另一种选择是创建字典:
var selections = new Dictionary<string, string>()
{
{ "1401", "AutoRepickAfterCAlignError" },
{ "2221", "AutoRepickAfterCAlignError" },
{ "1501", "AutoRepicksAfterManualRecovery" },
{ "2041", "AutoRepicksAfterManualRecovery" },
// etc
};
if (selections.ContainsKey(subNumbers))
retStr = selections[subNumbers];范围:
但是,如果您需要支持范围,则基本上必须坚持使用if/else块。还有其他选择,但是如果您的代码中只有这么多这样类型的if/else块,那么它们往往过于复杂。
https://stackoverflow.com/questions/6095066
复制相似问题