设定值在线

时间:2017-09-26 10:58:44

标签: c# .net

我们可以用C#做​​的所有很棒的东西,我想知道我们是否可以做类似下面的事情:

  string totalWording =
  {
    if (isA)
      return "Value A";

    if (isB)
      return "Value B";

    if (isC)
      return "Value C";

    return "Default";
  };

所以这与?非常相似:除了你可以有超过2个可能的结果

string totalWording = isA ? "Value A" : "Default";

我很乐意创建一个返回值的方法,但我很喜欢能够立即看到简单的东西

private string GetTotalWording()
{
  if (isA)
    return "Value A";

  if (isB)
    return "Value B";

  if (isC)
    return "Value C";

  return "Default";
}

我想听听是否有人有一些我可以使用的好东西,或者我只是在祈祷。

编辑:

还有func选项,这是我想让我进入主题,因为它看起来你应该能够在声明一个值时直接使用一个函数..但那可能只是我

    Func<string> getTotalWording = () =>
    {
      if (isA)
        return "Value A";

      if (isB)
        return "Value B";

      if (isC)
        return "Value C";

      return "Default";
    };

2 个答案:

答案 0 :(得分:3)

使用重复的三元运算符。

string totalWording = isA ? "Value A" : (isB ? "Value B" : (isC ? "Value C" :  "Default"))

还有另外一种方法,如果你只有可管理数量的if,那么它们总是保持一致。使用字符串值创建枚举。

Below answer is based on another on Stack Overflow

您可以使用说明为这些语句创建枚举。

public enum Values
    {
        [Description("Value A")] A,
        [Description("Value B")] B,
        [Description("Value C")] C,
        [Description("Value D")] D
    }

然后,您可以创建一个函数来获取枚举描述

private static string GetEnumDescription(string text)
{
    var valueAttribs = typeof(Values).GetMember(text)[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
    return ((DescriptionAttribute)valueAttribs[0]).Description;
}

然后您可以将它们用作

var variable = "A";

    string description = 
      (Enum.IsDefined(typeof(Values), variable)) ? 
          GetEnumDescription(variable) : "Default";

    Console.WriteLine(description);
    Console.ReadLine();

答案 1 :(得分:2)

你可以嵌套方法并更简洁地列出,所以看起来更像是这样:

void someMethod(bool isA, bool isB, bool isC)
{
    string totalWording() {
        if (isA) return "Value A";
        if (isB) return "Value B";
        if (isC) return "Value C";
        /*Else*/ return "Default"; }

    // Other code...

    string s = totalWording();

    // Etc
}

我个人认为更具可读性。

如果您不能使用C#7,您可以在早期版本中使用Lambda做类似的事情,正如您在问题中已经注意到的那样。为了完整起见,我会在这里复制一份:

void someMethod(bool isA, bool isB, bool isC)
{
    Func<string> totalWording = () => {
        if (isA) return "Value A";
        if (isB) return "Value B";
        if (isC) return "Value C";
        /*Else*/ return "Default"; };

    // Other code...

    string s = totalWording();

    // Etc
}

我非常喜欢使用三元运算符的原因是,在阅读三元版本时,我必须在尝试理解它时将其精神上翻译成上面的代码。

如果我必须这样做,那么我宁愿为我写下来,所以我不需要花费精力。也许这只是我,而且我很懒。 ;)