Reputation: 5862
I have 3 parameters to check with some conditions.
As an example my code as follows,
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;
}}
There have 3 parameters and 8 probability can happen based on its values. Here I check those as above code. But it looks ugly and I think it's not the best way to do this. what is most efficient and elegant way to do this
Upvotes: 1
Views: 206
Reputation: 724
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";
}
}
}
Upvotes: 0
Reputation: 861
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 );
}
** Code edited because I mis-typed String.Join as String.Format **
or you can also use byte for this if you want to make case by case answers
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;
}
Upvotes: 3
Reputation: 1725
what about grouping it first like so:
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;
}
also you need to note condition if it is equal. for example
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 ?
with if else
statement or The conditional operator (?:)
we can avoid that
Update
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";
}
}
Upvotes: 3
Reputation: 257
I would concatenate the results:
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;
Upvotes: 0
Reputation: 5703
One possible way could be to create dictionary, which contains your truth table and corresponding response, for example:
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)];
It's up to you to decide which variant is more elegant, this is just one of the possible solution.
Note, that here's using C# 7.0 features, ValueTuple at the dictionary keys, and expression bodied method checkIfConnditions
.
EDIT
Here is the example, which I have been used for testing:
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));
}
}
Note, that _responses
and checkIfConnditions
must be static in that case.
Upvotes: 0
Reputation: 5306
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;
}
Upvotes: 0