您迫切需要答案,这将不自然地迫使此代码变成switch
- 对于您所描述的问题,这不是 C、C++ 或 C# 的正确方法。与if
语句,如使用switch
在这种情况下,会导致代码可读性较差,并且可能会出现错误。
有些语言会评估switch
语句语法类似于序列if
语句,但 C、C++ 和 C# 不在其中。
在乔恩·斯基特(Jon Skeet)评论说这可能“有趣”之后try为了让它发挥作用”,我将违背我最初的判断并配合,因为确实可以通过尝试替代方案来学习,看看它们在哪里有效,在哪里无效。希望我不会最终把事情搞得比我应该的还要混乱……
所考虑的语言中 switch 语句的目标必须是常量 - 它们不是在运行时计算的表达式。但是,您可能会得到与您正在寻找的行为类似的行为if您可以将想要作为切换目标的条件映射到哈希函数,该函数将生成与条件匹配的完美哈希。如果可以做到这一点,您可以调用哈希函数并打开它生成的值。
当您想要打开字符串值时,C# 编译器会自动为您执行类似的操作。在 C 中,当我想要打开字符串时,我手动执行了类似的操作。我将目标字符串与用于标识字符串的枚举一起放在表中,然后打开枚举:
char* cmdString = "copystuff"; // a string with a command identifier,
// maybe obtained from console input
StrLookupValueStruct CmdStringTable[] = {
{ "liststuff", CMD_LIST },
{ "docalcs", CMD_CALC },
{ "copystuff", CMD_COPY },
{ "delete", CMD_DELETE },
{ NULL, CMD_UNKNOWN },
};
int cmdId = strLookupValue( cmdString, CmdStringTable); // transform the string
// into an enum
switch (cmdId) {
case CMD_LIST:
doList();
break;
case CMD_CALC:
doCalc();
break;
case CMD_COPY:
doCopy();
break;
// etc...
}
而不必使用一系列if
声明:
if (strcmp( cmdString, "liststuff") == 0) {
doList();
}
else if (strcmp( cmdString, "docalcs") == 0) {
doCalc();
}
else if (strcmp( cmdString, "copystuff") == 0) {
doCopy();
}
// etc....
顺便说一句,对于这里的字符串到函数映射,我个人认为表查找/switch 语句组合更具可读性,但我想有些人可能更喜欢更直接的方法if
顺序。
您问题中的表达式集看起来并不特别容易转换为散列 - 您的散列函数几乎肯定最终会成为一系列if
语句 - 你基本上只是将构造移动到其他地方。乔恩·斯基特 (Jon Skeet) 最初的答案本质上是将你的表达式转换为散列,但是当or
操作被放入其中一项测试中,哈希函数崩溃了。