我目前有一段代码如下:
switch (objectname)
{
case "objectbla":
DoSomething(1, objectName, someOtherVar);
break;
case "objectblabla":
DoSomething(2, objectName, someOtherVar);
break;
case "objectetc":
DoSomething(3, objectName, someOtherVar);
break;
case "objectanother":
DoSomething(4, objectName, someOtherVar);
break;
case "objectobj":
DoSomething(5, objectName, someOtherVar);
break;
default:
break;
}
现在,看看此开关的重复性,只有第一个参数计数一次,我确信这可以更有效地编写。不过,我不确定。写这个更好的方法是什么?
答案 0 :(得分:6)
如果第一个参数是唯一根据objectname
而不同的参数,您应该考虑使用字典:
// you only have to set this up once
var lookup = new Dictionary<string, int>()
{
["objectbla"] = 1,
["objectblabla"] = 2,
["objectetc"] = 3,
["objectanother"] = 4,
["objectobj"] = 5,
};
// actual logic
if (lookup.TryGetValue(objectname, out var objectId))
{
DoSomething(objectId, objectName, someOtherVar);
}
else
{
// objectname is not in the lookup dictionary
}
这是一般的想法。根据查找的外观,您也可以选择不同的解决方案,但字典是最冗长但最灵活的方式。
答案 1 :(得分:1)
如果必须是switch
,那该怎么做:
int aNumber;
switch (objectname)
{
case "objectblabla":
aNumber = 1
break;
case "objectetc":
aNumber = 2
break;
case "objectanother":
aNumber = 3
break;
case "objectobj":
aNumber = 4
break;
default:
break;
}
DoSomething(aNumber, objectName, someOtherVar);
如果没有:
string[] ListOfObjectNames = { "objectblabla", "objectetc", "objectanother" };
DoSomething(Array.IndexOf(ListOfObjectNames, objectname), objectName, someOtherVar);
答案 2 :(得分:1)
你是对的,有更好的方法。 如果您创建一个静态字典作为查找表,那么您可以使用它来获取您的幻数。
static Dictionary<string, int> lookup= new Dictionary<string, int>()
{
{ "objectbla",1},
{"objectblabla", 2},
etc.
};
然后你的职能部门变成:
DoSomething(lookup[objectname], objectName, someOtherVar);
您还应该添加代码以考虑使用无效密钥的可能性,否则,它会抛出异常。
答案 3 :(得分:1)
我选择了enum方法。
__doPostBack('Button2', '');