【问题标题】:More elegant if statement更优雅的 if 语句
【发布时间】:2018-06-19 10:17:55
【问题描述】:

我希望将一个值与一个列表进行比较,然后根据此比较设置另一个变量。

我的清单是

1 = Red
4 = Blue
13 = Green

我可以有一系列 if 语句,但是如果列表很大,这看起来很乱

if (Type == 1)
{
    Name = "Red";
}
else if (Type == 4)
{
    Name = "Blue";
}
else if (Type == 13)
{
    Name = "Green";
}

什么是实现相同目标的有效且整洁的方法?

【问题讨论】:

  • 改用switch。
  • 您需要将类型设为整数吗?我会推荐一个枚举。这也将允许直接从枚举值中分配名称。
  • 另外,建议你为这些类型创建一个枚举类型。它会更优雅。
  • 在字典中组织对应的值
  • @ViRuSTriNiTy 我认为你把它看得太个人化了。问题的标题是“更优雅”,您不认为您建议的答案(以及哪个有效)比优雅更“快速和肮脏”(尽管优雅实际上是个人选择的问题)

标签: c# optimization


【解决方案1】:

利用字典存储你的值,这样代码行数更少,可读性也更好

Dictionary<int, string> data = new Dictionary<int, string>
{
    { 1, "Red" }, 
    { 4, "Blue" },
    { 13, "Green" }
};

string test;
if (data.TryGetValue(1, out test)) // Returns true.
{
   Console.WriteLine(test); 
}

【讨论】:

  • 但是这样你总是需要先从字典中取出字符串表示。使用枚举可以消除这种需求。
  • @ViRuSTriNiTy “从字典中取出字符串”比“枚举值上的 ToString”更糟吗?
  • @ViRuSTriNiTy 是的,但是通过此实现,您可以使地图动态化并将其存储在配置文件 db 中...如果您想使用枚举添加新颜色,则必须重新构建/ 重新部署应用程序
  • @DavidG @vc74 当然可以挑剔任何解决方案。我只是指出您应该或更好地调用TryGetValue() 以避免危险,例如将新的未定义项添加到字典中。单独使用枚举不会有这种危险,但肯定会出现其他缺点。
  • @ViRuSTriNiTy 我并不是说您的解决方案更好/更差,正如您所说的每个解决方案都有其优缺点。但对我来说,将您支持的颜色集合(可能在枚举中)与序列化/反序列化这些颜色的方式分开,我似乎更清楚。
【解决方案2】:

我认为你需要在这里使用 switch:

switch (Type)
  {
      case 1:
          Name = "Red";
          break;
      case 4:
          Name = "Blue";
          break;
      case 13:
          Name = "Green";
          break;
  }

【讨论】:

  • 这不是更优雅。
  • @ViRuSTriNiTy 我想说这比一堆if 声明要好得多。
  • @DavidG 虽然我接受它,但我永远不会理解这个推理。在我看来,使用 switch 是在丑化代码。
  • @ViRuSTriNiTy 这可能是因为所有这些breaks,在 C# 中具有“无中断”开关构造会非常方便(我认为我不需要在 C# 中中断)
  • @ViRuSTriNiTy 我同意它可能会变得丑陋,尤其是使用 break 语句。但是,请将其放入实用程序函数中,并改为 return 值。这使得 imo 的代码更加简洁。
【解决方案3】:

使用 switch 语句插入

  switch (Type)
  {
      case 1:
          Name = "Red";
          break;
      case 4:
          Name = "Blue";
          break;
      case 13:
          Name = "Green";
          break;
  }

【讨论】:

    【解决方案4】:
        class Program
        {
            public enum EnumDisplayStatus
            {
                Red = 1,
                Blue = 2,
                Yellow = 3,
                Orange = 4
            }
            static void Main()
            {
                int value = 3;
                EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)value;
                string color = enumDisplayStatus.ToString();
                Console.Write(color);
            }
        }
    

    使用枚举并以我展示的这种方式获取字符串。

    【讨论】:

    • 刚刚讨论了依赖枚举 ToString() 方法的问题 - 如果需要本地化会出现问题,如果格式化也会出现问题(例如“浅蓝色”等颜色中的空格)。这些可以通过提供TypeConverter 或EnumConverter 或简单地覆盖 ToString 方法来避免。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2020-07-30
    • 2017-05-10
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多