简体   繁体   中英

Are switch-case statements allowed for multiple conditions?

I was going to do a complex number class, and I appear to have too many conditionals involving multiple statements on one of my functions. Here is a snippet of my program with a ToString() function:

public override string ToString()
{
    if (this.real == 0 && this.imaginary == 0)
    {
        return "0";
    }
    else if (this.real == 0 && this.imaginary == 1)
    {
        return "i";
    }
    else if (this.real == 0 && this.imaginary == -1)
    {
        return "-i";
    }
    else if (this.real == 0 && (this.imaginary != 1 && this.imaginary != -1))
    {
        return String.Concat(this.imaginary.ToString(), "i");
    }
    else if (this.real != 0 && this.imaginary == 0)
    {
        return String.Concat(this.real.ToString());
    }
    else if (this.real != 0 && this.imaginary == 1)
    {
        return String.Concat(this.real.ToString(), " + i");
    }
    else if (this.real != 0 && this.imaginary == -1)
    {
        return String.Concat(this.real.ToString(), " - i");
    }
    else if (this.real != 0 && this.imaginary < -1)
    {
        this.imaginary = -this.imaginary;
        return String.Concat(this.real.ToString(), " - ", this.imaginary.ToString(), "i");
    }
    return String.Concat(this.real.ToString(), " + ", this.imaginary.ToString(), "i");
}

Would switch statements be helpful for multiple conditions?

Make code more readable with eliminating redundant checks.

Use string interpolation instead of String.Concat

public override string ToString()
{
     if (real == 0)
     {
          if (imaginary == 0)
          {
              return "0";
          }

          if (imaginary == 1)
          {
              return "i";
          }

          if (imaginary == -1)
          {
              return "-i";
          }

          if (imaginary != 1)
          {
              return $"{imaginary}i";
          }
    }
    else
    {
         if (imaginary == 0)
         {
             return real.ToString();
         }
         if (imaginary == 1)
         {
             return $"{real} + i";
         }
         if (imaginary == -1)
         {
             return $"{real} - i";
         }
         if (imaginary < -1)
         {
              imaginary = -imaginary;
              return $"{real} - {imaginary}i"; 
         }
  }

  return $"{real} + {imaginary}i";
}

You cannot have more than one condition in switch , but it looks like this.real has only two possibilities, 0 or 1, so you can take that out an use a switch for this.imaginary .

Also it is probably better to use String.Format() or String Interpolation instead of String.Concat() .

public override string ToString() {
    if (this.real == 0) {
        switch(this.imaginary) {
            case 0:
                return "0";
            case 1:
                return "i";
            case -1:
                return "-i";
            default:
                return $"{this.imaginary}i";
    }
    else {
        switch(this.imaginary) {
            case 0:
                return this.real.ToString();
            case 1:
                return $"{this.real} + i";
            case -1:
                return $"{this.real} - i";
            default:
                if (this.imaginary < -1) {
                    this.imaginary = -this.imaginary;
                    return $"{this.real} - {this.imaginary}i";
                }
        }
    }
    return $"{this.real} + {this.imaginary}i";
}

Your code is overcomplicated and redundant because you've come up with a separate branch for each possible situation. Your code will be a lot simpler if you break it down and do the following:

  1. Get the real part (if there is one) and the imaginary part (if there is one)
  2. Combine them together if there are two parts

The following will do this:

private string RealPartString()
{
    if (real == 0) { return imaginary == 0 ? "0" : null; }

    return real.ToString();
}

private string ImaginaryPartString()
{
    if (imaginary == 0) { return null; }

    var abs = Math.Abs(imaginary);
    var number = abs == 1 ? "" : abs.ToString();
    // Only include the sign here if there is no real part
    var sign = real == 0 && imaginary < 0 ? "-" : "";

    return sign + number + "i";
}

public override string ToString()
{
    var parts = new[] { RealPartString(), ImaginaryPartString() }.Where(s => s != null);
    var sign = imaginary < 0 ? " - " : " + ";

    return string.Join(sign, parts);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM