多个if-else的switch语句的最佳方法

时间:2015-07-16 06:38:53

标签: c# switch-statement

我正在尝试转换大量的'if else'以切换stements 需要指针用于最佳切换情况,一些代码结构如下所示。

代码:

    Public void ImageTest(String format, string path)
    {
        //Other Code

        //if-Else part
        try
        {
            if (strImageFormat.Equals("BMP"))
             {
                   if (Convert.ToString(dataRow["IsEmployee"]).ToUpper() == "TRUE")
                   {
                      ImagePath = string.Format("{0}{1}", fileNameUpper, ".BMP");
                   }
                   else
                    {
                      ImagePath = string.Format("{0}{1}", fileNamelabel, ".BMP");
                    }

             }      
            else if (strImageFormat.Equals("GIF"))
              {
                if (Convert.ToString(dataRow["IsEmployee"]).ToUpper() == "TRUE")
                   {
                    ImagePath = string.Format("{0}{1}", fileNameUpper, ".GIF");
                    }
                    else
                    {
                    ImagePath = string.Format("{0}{1}", fileNameUpper, ".GIF");
                    }
               }
            else if (strImageFormat.Equals("JPEG"))
              {
                if (Convert.ToString(dataRow["IsEmployee"]).ToUpper() == "TRUE")
                  {
                    ImagePath = string.Format("{0}{1}", fileNameUpper, ".JPEG");
                  }
                    else
                    {
                    ImagePath = string.Format("{0}{1}", fileNameUpper, ".JPEG");
                    }
                }
            else if (strImageFormat.Equals("PDF"))
                {
                  if (Convert.ToString(dataRow["IsEmployee"]).ToUpper() == "TRUE")
                    {
                     ImagePath = string.Format("{0}{1}", fileNameUpper, ".PDF");
                    }
                    else
                     {
                      ImagePath = string.Format("{0}{1}", fileNameUpper, ".PDF");
                      }
                 }
        }
        catch(Exception ex)
        {

        }
}

5 个答案:

答案 0 :(得分:4)

看起来代码

   if (Convert.ToString(dataRow["IsEmployee"]).ToUpper() == "TRUE")
   {
     ImagePath = string.Format("{0}{1}", fileNameUpper, ".GIF");
   }
   else
   {
     // fileNamelabel expected, not fileNameUpper
     ImagePath = string.Format("{0}{1}", fileNameUpper, ".GIF");
   }

冗余或只是复制粘贴。提供它的复制粘贴:

  if (Convert.ToString(dataRow["IsEmployee"]).Equals("TRUE", StringComparison.OrdinalIgnoreCase))
    ImagePath = string.Format("{0}.{1}", fileNameUpper, strImageFormat);
  else
    ImagePath = string.Format("{0}.{1}", fileNamelabel, strImageFormat);  

注意更改格式的{0}.{1}

答案 1 :(得分:4)

我宁愿不使用太多的switch语句并将值存储在bool中,然后在case中使用条件运算符:

2n

答案 2 :(得分:2)

我在C#中使用工厂模式。这使得您的代码更加灵活,并且由于字符串的切换无论如何都会转换为C#中的字典,因此在性能方面并不重要。

有关实施的详细信息,我已经在Naming convention for GoF Factory?上发布了不久前的实施。

答案 3 :(得分:1)

另一个想法,不需要switch语句。

bool isEmployee = Convert.ToString(dataRow["IsEmployee"]).ToUpper() == "TRUE";
ImagePath = string.Format("{0}.{1}", isEmployee ? fileNameUpper : fileNamelabel, strImageFormat);

答案 4 :(得分:1)

我认为你不应该使用开关盒而不是ifs。

你应该以正确的方式解决它,这意味着使用多态。

查看设计模式http://www.dofactory.com/net/factory-method-design-pattern

查看以下初始骨架:

public static class TestEliminateSwitch
{
    public static string GetImagePath()
    {
        var formatFactory = new FormatFactory();
        var instance = formatFactory.GetFomatClass("PDF");
        return instance.GetImagePath("TRUE");
    }
}
public class FormatFactory
{
    public FormatBase GetFomatClass(string formatName)
    {
        string className = typeof (FormatBase).FullName.Replace("Base", formatName);
        return Assembly.GetExecutingAssembly()
            .CreateInstance(className) as FormatBase;
    }
}
public abstract class FormatBase
{
    public string fileNameUpper = string.Empty;
    public string fileNamelabel = string.Empty;
    public virtual string GetImagePath(string IsEmployee)
    {
        return string.Format("{0}{1}", IsEmployee.ToUpper() == "TRUE" ? fileNameUpper : fileNamelabel, GetFileExtention());
    }

    public abstract string GetFileExtention();
}
class FormatPDF : FormatBase
{
    public override string GetFileExtention()
    {
        return ".PDF";
    }
}
class FormatGIF : FormatBase
{
    public override string GetFileExtention()
    {
        return ".GIF";
    }
}