在某些情况下,我有3个参数需要检查。
作为示例,我的代码如下,
public static string checkIfConnditions(string msg, int score, int age)
{
var response = "";
if (msg == "hello" && score >= 20 && age <= 25)
{
response = "All para success";
}
if (msg != "hello" && score >= 20 && age <= 25)
{
response = "Unmatching message";
}
if (msg == "hello" && score < 20 && age <= 25)
{
response = "Score not satisfied";
}
if (msg == "hello" && score >= 20 && age > 25)
{
response = "Age not satisfied";
}
if (msg != "hello" && score < 20 && age <= 25)
{
response = "Unmatiching message & Score not satisfied ";
}
if (msg != "hello" && score >= 20 && age > 25)
{
response = "Unmatiching message & Age not satisfied";
}
if (msg == "hello" && score < 20 && age > 25)
{
response = "Age & Score not satisfied";
}
if (msg != "hello" && score < 20 && age > 25)
{
response = "All parameter unsatisfied";
}
return response;
}}
有3个参数,并且根据其值可以发生8个概率。在这里,我检查以上代码。但这看起来很难看,我认为这不是最好的方法。什么是最有效,最优雅的方法
答案 0 :(得分:3)
首先将其分组的方式是这样:
public string checkIfConnditions(string msg, int score, int age)
{
var response = "";
if (msg == "hello") {
response = score > 20 ?
age > 25 ? "Age not satisfied" : "All para success"
: age < 25 ? "Score not satisfied" : "Age & Score not satisfied";
} else {
if (score > 20)
{
response = age < 25 ? "Unmatching message" : "Unmatiching message & Age not satisfied" ;
} else {
response = age < 25 ? "Unmatiching message & Score not satisfied " : "All parameter unsatisfied" ;
}
}
return response;
}
还需要注意条件是否相等。例如
if (msg == "hello" && score > 20 && age < 25)
{
response = "All para success";
}
//and ...
if (msg == "hello" && score < 20 && age < 25)
{
response = "Score not satisfied";
}
// what if score == 20 ?
使用if else
语句或The conditional operator (?:)
我们可以避免这种情况
更新
if(msg == "hello")
{
if(score < 20)
{
response = age > 25 ? "Age & Score not satisfied" : "Score not satisfied";
} else {
response = age > 25 ? "Age not satisfied" : "All para success";
}
} else {
if(score < 20)
{
response = age > 25 ? "All parameter unsatisfied" : "Unmatiching message & Score not satisfied ";
} else {
response = age > 25 ? "Unmatiching message & Age not satisfied" : "Unmatching message";
}
}
答案 1 :(得分:3)
List<String> Errors = new List<String>();
int chk = 3;
if ( msg != "hello" )
{
Errors.Add( "Unmatching message" );
}
if ( score < 20 )
{
Errors.Add( "Score not satisfied" );
}
if ( age > 25 )
{
Errors.Add( "Age not satisfied" );
}
if ( Errors.Count == 0 )
{
return "All para success";
}
else if ( Errors.Count == 3)
{
return "All parameter unsatisfied";
}
else
{
return String.Join( " & ", Errors );
}
**因为我错误键入String.Join作为String.Format **,所以代码已编辑
或者如果您想逐个回答,也可以使用字节
int flag = 0x0;
if ( msg == "hello" )
{
flag |= 0x1;
}
if ( score > 20 )
{
flag |= 0x2;
}
if ( age < 25 )
{
flag |= 0x4;
}
switch ( flag )
{
case 0x7:
response = "All para success";
break;
case 0x6:
response = "Unmatching message";
break;
case 0x5:
response = "Score not satisfied";
break;
case 0x4:
response = "Unmatiching message & Age not satisfied";
break;
case 0x3:
response = "Score not satisfied";
break;
case 0x2:
response = "Unmatiching message & Score not satisfied ";
break;
case 0x1:
response = "Score not satisfied & Age not satisfied";
break;
default:
response = "All parameter unsatisfied";
break;
}
答案 2 :(得分:0)
private const string MESSAGE = "hello";
private const int SCORE = 20;
private const int AGE = 25;
public string checkIfConnditions(string msg, int score, int age)
{
if (msg == MESSAGE)
{
if (score > SCORE)
{
return age < AGE ? "All para success" : "Age not satisfied";
}
else
{
return age < AGE ? "Score not satisfied" : "Age & Score not satisfied";
}
}
else
{
if (score > SCORE)
{
return age < AGE ? "Unmatching message" : "Unmatiching message & Age not satisfied";
}
else
{
return age < AGE ? "Unmatiching message & Score not satisfied " : "All parameter unsatisfied";
}
}
}
答案 3 :(得分:0)
一种可能的方法是创建字典,其中包含您的真值表和相应的响应,例如:
private readonly Dictionary<(bool isMsgValid, bool isScoreValid, bool isAgeValid), string> _responses
= new Dictionary<(bool, bool, bool), string>()
{
[(true, true, true)] = "All para success",
[(false, false, false)] = "All parameter unsatisfied",
[(false, true, true)] = "Unmatching message",
[(true, false, true)] = "Score not satisfied",
[(true, true, false)] = "Age not satisfied",
[(false, false, true)] = "Unmatiching message & Score not satisfied",
[(false, true, false)] = "Unmatiching message & Age not satisfied",
[(true, false, false)] = "Age & Score not satisfied"
};
public string checkIfConnditions(string msg, int score, int age)
=> _responses[(msg == "hello", score > 20, age < 25)];
由您决定哪种版本更优雅,这只是可能的解决方案之一。
请注意,这里使用的是C# 7.0 features,字典键处的ValueTuple和表达式合并的方法checkIfConnditions
。
编辑
以下是示例,我已将其用于测试:
public static class Program
{
private static readonly Dictionary<(bool isMsgValid, bool isScoreValid, bool isAgeValid), string> _responses
= new Dictionary<(bool, bool, bool), string>()
{
[(true, true, true)] = "All para success",
[(false, false, false)] = "All parameter unsatisfied",
[(false, true, true)] = "Unmatching message",
[(true, false, true)] = "Score not satisfied",
[(true, true, false)] = "Age not satisfied",
[(false, false, true)] = "Unmatiching message & Score not satisfied",
[(false, true, false)] = "Unmatiching message & Age not satisfied",
[(true, false, false)] = "Age & Score not satisfied"
};
public static string checkIfConnditions(string msg, int score, int age)
=> _responses[(msg == "hello", score > 20, age < 25)];
public static void Main(string[] args)
{
Console.WriteLine(checkIfConnditions("hello", 45, 20));
Console.WriteLine(checkIfConnditions("hello", 45, 30));
Console.WriteLine(checkIfConnditions("hello", 10, 20));
Console.WriteLine(checkIfConnditions("hello", 10, 30));
Console.WriteLine(checkIfConnditions("goodbye", 45, 20));
Console.WriteLine(checkIfConnditions("goodbye", 10, 30));
Console.WriteLine(checkIfConnditions("goodbye", 45, 20));
Console.WriteLine(checkIfConnditions("goodbye", 10, 30));
}
}
请注意,在这种情况下,_responses
和checkIfConnditions
必须是静态的。
答案 4 :(得分:0)
Sometimes these long "if's" can get a little messy.
public string checkIfConnditions(string msg, int score, int age)
{
string response = string.Empty;
if (msg == "hello")
{
if (score > 20 && age < 25)
response = "All para success";
else if (score < 20 && age < 25)
response = "Score not satisfied";
else if (score > 20 && age > 25)
response = "Age not satisfied";
else if ( score < 20 && age > 25) // Corrected this line
response = "Age & Score not satisfied";
}
else
{
if (score < 20 && age < 25)
response = "Unmatiching message & Score not satisfied ";
else if (score > 20 && age > 25)
response = "Unmatiching message & Age not satisfied";
else if (score > 20 && age < 25)
response = "Unmatching message";
else if (score < 20 && age > 25)
response = "All parameter unsatisfied";
}
return response;
}
答案 5 :(得分:0)
我将合并结果:
public string checkIfConnditions(string msg, int score, int age)
{
List<String> msgList = List<String>();
if (msg != "hello")
msgList.add("Message");
if (score < 20)
msgList.add("Score");
if (age > 25)
msgList.add("Age");
var response = "All para success"
for(int i=0;i<msgList.Count;i++)
{
if(i=0)
response = msgList[i]
else
response += " & "+ msgList[i]
if(i==msgList.Count-1)
response += " not satisfied"
}
return response;