problem with if statement

Hi there,
I have the following if statement that is supposed to check the dates, I just need to know if I have done this right??
            if (PayReceived < BikeRecieved)
            {
                PaymentPeriod = "A";
            }
            else if ((PayReceived > BikeRecieved) && (PayReceived <= firstDate))
            {
                PaymentPeriod = "B";
            }
            else if ((PayReceived > firstDate) && (PayReceived <= secondDate))
            {
                PaymentPeriod = "C";
            }
            else if ((PayReceived > secondDate) && (PayReceived <= thirdDate))
            {
                PaymentPeriod = "D";
            }
            else if ((PayReceived > thirdDate) && (PayReceived <= fourthDate))
            {
                PaymentPeriod = "E";
            }
            else if ((PayReceived > fourthDate) && (PayReceived <= fifthDate))
            {
                PaymentPeriod = "F";
            }
            else if ((PayReceived > fifthDate) && (PayReceived <= sixthDate))
            {
                PaymentPeriod = "G";
            }
            else if (PayReceived > sixthDate)
            {
                PaymentPeriod = "H";
            }
            else
            {
                PaymentPeriod = "null";
            }
Can you please let me know asap

Thanks,
Stelly
stellyukAsked:
Who is Participating?
 
ducketsConnect With a Mentor Commented:

I would argue that it is fine to leave it as an 'if' statement.

Yes everyone knows, as a broad and general rule, long 'if' statements are a Bad Thing - but only when they could be better implemented in another way. I would say this particular case is an exception to the rule, as the contents of each 'if' or 'elseif' clause are extremely simple, and therefore very readable.

The purpose and function of the original code is understandable at a quick glance, whereas converting it to an array and looping through is much more complex, less readable, and probably less efficient for the computer to execute. Converting it to a loop with an array is just refactoring for refactoring's sake.

As a side note, if the dates are listed in chronological order, you can safely remove the first of each pair of comparisons in each condition. You can also remove the 'null' statement because (with the fix to the first line) it will never be reached. This will leave you with the following neat, simple code.

if (PayReceived <= BikeRecieved)
{
	PaymentPeriod = "A";
}
else if (PayReceived <= firstDate)
{
	PaymentPeriod = "B";
}
else if (PayReceived <= secondDate)
{
	PaymentPeriod = "C";
}
else if (PayReceived <= thirdDate)
{
	PaymentPeriod = "D";
}
else if (PayReceived <= fourthDate)
{
	PaymentPeriod = "E";
}
else if (PayReceived <= fifthDate)
{
	PaymentPeriod = "F";
}
else if (PayReceived <= sixthDate)
{
	PaymentPeriod = "G";
}
else 
{
	PaymentPeriod = "H";
}

Open in new window

0
 
lucky_jamesCommented:
yes, seems to be right.......
let me know if you are facing any problems in it.........

Best Regards,
James
0
 
bungHocCommented:
Looks fine. But long 'IF' like this imo is not a good thing.
0
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
stellyukAuthor Commented:
Well bungHoc, if you have a better idea, please let me hear it.

Stelly
0
 
ducketsCommented:
Actually the very first line should probably use <= instead of just <, because currently if PayReceived is exactly equal to BikeRecieved, the PaymentPeriod will be set to "null".

- Ben

0
 
Jaime OlivaresSoftware ArchitectCommented:
alternative way to do it:

DateTime[] dates = new DateTime[] { BikeRecieved, firstDate, secondDate, thirdDate, fourthDate, fifthDate, sixthDate };

PaymentPeriod = "null";
if (PayReceived > BikeRecieved)
{
     for (int i=0; i<dates.Length-1; i++)
          if (PayReceived > dates[i] && PayReceived <= dates[i+1])
          {
                PaymentPeriod = ('A' + (char)i).ToString();
                break;
          }
}
else
     PaymentPeriod = "A";
0
 
Jaime OlivaresSoftware ArchitectCommented:
sorry, it should be:
                PaymentPeriod = ('A' + (char)(i+1)).ToString();
0
 
bungHocCommented:
Okay.. Jaime beat me to it already.
0
 
Jaime OlivaresSoftware ArchitectCommented:
simplified version:


      DateTime[] dates = new DateTime[] { BikeRecieved, firstDate, secondDate, thirdDate, fourthDate, fifthDate, sixthDate };
 
     PaymentPeriod = "null";
     for (int i=0; i<dates.Length; i++)
          if (PayReceived <= dates[i])
          {
                PaymentPeriod = ('A' + (char)i).ToString();
                break; 
          }

Open in new window

0
 
ducketsCommented:
Heh, BTW, I also noticed that although you spelled ;Received' correctly in 'PayReceived', you spelled it incorrectly in 'BikeRecieved'! :-)
0
 
bungHocCommented:
duckets,

I'm not 'by the book' dude. And converting to a loop with an array is not just refactoring for refactoring's sake. Putting them all into array reduce trouble for you if let's say you have A-Z categories.
0
 
Jaime OlivaresSoftware ArchitectCommented:
>>whereas converting it to an array and looping through is much more complex, less readable....
This is usually solved by putting a clear comment about the purpose of the loop

>>and probably less efficient for the computer to execute
I don't know how, the numbers of IFs will be the same
0
 
ducketsCommented:
bunHoc wrote:
>> Putting them all into array reduce trouble for you if let's say you have A-Z categories.

If stellyuk wanted to adapt his/her code so the number of categories could be variable, then sure, an array + loop might then be the best solution, but that's not what the original question was.

jaime_olivares wrote:
>> >> and probably less efficient for the computer to execute
>> I don't know how, the numbers of IFs will be the same

Because in addition to the IFs, you are also building the array, performing the evaluation for the loop, retrieving items from the array, computing the character code for the correct character and then converting it to a string.
0
 
Jaime OlivaresSoftware ArchitectCommented:
>>Because in addition to the IFs, you are also building the array, performing the evaluation for the loop, retrieving items from the array, computing the character code for the correct character and then converting it to a string.

and how many microseconds do you estimate it will take?
0
 
ducketsCommented:
Very few. But still - it is less efficient and less readable than stellyuk's original code.
0
 
Jaime OlivaresSoftware ArchitectCommented:
>>But still - it is less efficient and less readable than stellyuk's original code.
Thanks for sharing your opinion.
0
 
stellyukAuthor Commented:
Hey All,

Thanks for all your comments, but would this be better:

Let me know what you think...
Stelly
            else if ((DateTime.Compare(PayReceived,BikeRecieved) >0) && (DateTime.Compare(PayReceived,firstDate) <=0))
            {
                PaymentPeriod = "B";
            }
            else if ((DateTime.Compare(PayReceived,firstDate) >0) && (DateTime.Compare(PayReceived,secondDate) >=0))
            {
                PaymentPeriod = "C";
            }
            else if ((DateTime.Compare(PayReceived,secondDate) >0) && (DateTime.Compare(PayReceived,thirdDate) >=0))
            {
                PaymentPeriod = "D";
            }
            else if ((DateTime.Compare(PayReceived,thirdDate) >0) && (DateTime.Compare(PayReceived,fourthDate) >=0))
            {
                PaymentPeriod = "E";
            }
            else if ((DateTime.Compare(PayReceived,fourthDate) >0) && (DateTime.Compare(PayReceived,fifthDate) >=0))
            {
                PaymentPeriod = "F";
            }
            else if ((DateTime.Compare(PayReceived,fifthDate) >0) && (DateTime.Compare(PayReceived,sixthDate) >=0))
            {
                PaymentPeriod = "G";
            }
            else if (DateTime.Compare(PayReceived,sixthDate) >0)
            {
                PaymentPeriod = "H";
            }
            else
            {
                PaymentPeriod = "null";
            }

Open in new window

0
 
Jaime OlivaresSoftware ArchitectCommented:
the DateTime.Compare() is unnecessary also a single comparison is enough in each if () statement.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.