实际上我正在尝试减少if else条件,但我没有在C中做到如何做。
例如我的代码是
if(this.Index==1100 && this.SubIndex==1)
{
putValue(Com_stMECUErr,this.Data);
}
else if(this.Index==1100 && this.SubIndex==2)
{
putValue(B_sbbvk,this.Data);
}
else if(this.Index==1100 && this.SubIndex==3)
{
putValue(Com_bMSVIdle,this.Data);
}
// haivng 100 more similar conditions
}
答案 0 :(得分:5)
如果值在连续范围内:
yourtypehere subIndexValues[] = {whatever, Com_stMECUErr, B_sbbvk, Com_bMSVIdle};
if(this.Index==1100)
{
putValue(subIndexValues[this.SubIndex],this.Data);
}
或者您可以将if
s混合用于索引,并将case
s /数组用于特定范围。
答案 1 :(得分:3)
你可以摆脱一些像这样的冗余:
if (this.Index == 1100)
{
switch (this.SubIndex)
{
case 1:
putValue(Com_stMECUErr, this.Data);
break;
case 2:
putValue(B_sbbvk, this.Data);
break;
case 3:
putValue(Com_bMSVIdle, this.Data);
break;
...
default:
...
break;
}
}
答案 2 :(得分:2)
如果SubIndex未映射到特定值,则使用if或switch。
这是if方式。
if(this.Index == 1100) {
if (this.SubIndex==1) putValue(Com_stMECUErr, this.Data);
if (this.SubIndex==2) putValue(B_sbbvk, this.Data);
if (this.SubIndex==3) putValue(Com_bMSVIdle,this.Data);
// 100's more if's
} else { //if this.Index != 1100
}
这是转换方式。
if(this.Index == 1100) {
switch(this.SubIndex) {
case 1: putValue(Com_stMECUErr, this.Data); break;
case 2: putValue(B_sbbvk, this.Data); break;
case 3: putValue(Com_bMSVIdle,this.Data); break;
// 100's more cases
default: break;
}
// 100's more if's
} else { //if this.Index != 1100
}
如果SubIndex确实映射到特定值,那么您可以使用数组以最短的方式执行它。
YourDataType values[] = {
whatever,
Com_stMECUErr,
B_sbbvk,
Com_bMSVIdle,
hundredsmore
}
if(this.Index == 1100) {
putValue(values[this.SubIndex], this.Data);
}
答案 3 :(得分:1)
if (this.Index==1100) {
if (this.SubIndex==1)
putValue(Com_stMECUErr, this.Data);
if (this.SubIndex==2)
putValue(B_sbbvk, this.Data);
if (this.SubIndex==3)
putValue(Com_bMSVIdle,this.Data);
// haivng 100 more similar conditions
}
或类似
if (this.Index==1100) {
the_type_of_the_first_argument_of_putValue table1100[]= {
Com_stMECUErr, // 1
B_sbbvk, // 2
Com_bMSVIdle // 3
// haivng 100 more similar conditions
};
if (this.SubIndex<=no_of_entries_in_table1100)
putValue(table1100[this.SubIndex-1], this.Data);
else
printf("value not found.");
}
答案 4 :(得分:0)
在这种情况下,您可以检查this.Index == 1100一次然后使用switch语句来测试子索引
即。因为您可以在所有条件下进行常见检查,所以您可以提取它:
if (this.Index==1100){
switch(this.Subindex){
case 1:
...
case 2:
...
}
}
答案 5 :(得分:0)
您可以使用switch语句缩短代码,并移动一个if语句:
if (this.Index == 1100) {
switch(this.SubIndex) {
case 1:
putValue(Com_stMECUErr,this.Data);
break;
case 2:
putValue(B_sbbvk,this.Data);
break;
case 3:
putValue(Com_bMSVIdle,this.Data);
break;
default:
break;
}
}
答案 6 :(得分:0)
每个SubIndex是否映射到特定值?
在这种情况下,您可以创建一个HashMap或类似的跟踪映射的HashMap。如果你这样做,每当你必须检查值时,你可以做以下事情:
if(this.Index == 1100){
putValue(someMap.get(this.SubIndex), this.Data);
}
这样做可以为您节省大量代码,特别是如果您必须在代码的不同部分多次检查映射。