问题描述
|
我有很长的其他代码
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中。
感谢帮助。
解决方法
我将错误代码映射到这样的字典中:
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];
,那应该很简单
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\")
具有相同的作用。
,首先,DRY原则-不要重复自己。将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\",{ \"1501\",\"AutoRepicksAfterManualRecovery\" },{ \"2041\",// etc
};
if (selections.ContainsKey(subNumbers))
retStr = selections[subNumbers];
范围:
但是,如果需要支撑范围,则基本上必须坚持使用if
/else
块。还有其他选择,但是如果您的代码中只有这么多类型的if
/else
块,那么它们就会很费事。
,您应该在errorCode和errorMessage之间使用相对性来初始化字典
Dictionary<int,string> errorsCache = new Dictionary<int,string>()
{
{1101,\"AutoRepickAfterPickError\"},{2121,{1401,\"AutoRepickAfterCAlignError\"},...
}
您可以定义GetErrorDescription方法
public string GetErrorDescription(string errorNumbers)
{
string retStr;
if (errorNumbers.Length == 6)
{
int errorCode;
if(int.TryParse(errorNumbers.Substring(0,4),out errorCode))
{
errorsCache.TryGetValue(errorCode,out retStr);
}
}
return retString;
// or you can return empty string instead of null
return retString ?? \"\";
}
,首先,在长if / else之前将errorNumbers.Substring(0,4)
存储在局部变量中。
然后,您可以使用映射/字典从预期的错误编号到适当的返回字符串消除整个if / else。
,您可以尝试以下方法:
if (errorNumbers.Length == 6)
{
//Makes it easier to change error codes,as theyre all in one place
string[] AutoRepickAfterPickError = { \"1101\",\"2121\"};
string[] AutoRepickAfterLAlignError = { \"1301\",\"2321\"};
string[] AutoRepickAfterCAlignError = { \"1401\",\"2221\"};
string[] AutoRepicksAfterManualRecovery = { \"1501\",\"2041\"};
string subString = errorNumbers.Substring(0,4);
if (AutoRepickAfterPickError.Contains(subString));
{
retStr = \"AutoRepickAfterPickError\";
}
else if (AutoRepickAfterLAlignError.Contains(subString))
{
retStr = \"AutoRepickAfterLAlignError\";
}
else if (AutoRepickAfterCAlignError.Contains(subString))
{
retStr = \"AutoRepickAfterCAlignError\";
}
else if (AutoRepicksAfterManualRecovery.Contains(subString))
{
retStr = \"AutoRepicksAfterManualRecovery\";
}
}
,那么选择案例呢? :D
errorNumber = errorNumbers.Substring(0,4)
Select Case errorNumber
Case 1101,2121
retStr = \"AutoRepickAfterPickError\";
Case 1301,2321
retStr = \"AutoRepickAfterLAlignError\";
...
End Select