【问题标题】:Setting value in-line在线设置值
【发布时间】:2017-09-26 19:42:31
【问题描述】:

有了我们可以在 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";
    };

【问题讨论】:

  • 一个语句是真还是假,在你的方法中你正在检查 3 个不同的布尔值,我可以很容易地将你的 GetTotalWording 转换为三元 (?:) 表达式,但我不认为它是你的'正在寻找。例如,如果所有 3 个都为真,结果应该是 Value A 吗?
  • 如果isAisC 都为真,或者在任何给定时间只有一个为真,该怎么办?
  • 还是他只想拿第一件真实的事,不管后面的是否真实?
  • 我提供的逻辑是分层的,所以先到先得。
  • 在这种情况下,Amit 展示的嵌套三元组可以做到这一点,但在简单易读的代码上使用“聪明”的内衬是一个常见的错误。

标签: c# .net


【解决方案1】:

使用三元运算符的重复。

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();

【讨论】:

  • 天啊,儿子。我在想类似的东西,但它并没有完全出来。有趣的。在标记为答案之前,我会看看是否还有其他问题。
  • @MatthewWatson,如果我要走这条路-我会用线分开。我目前使用的逻辑并不过分。
  • @Oyyou 说真的,不要这样做。与第一个版本相比,它是如此难以阅读。 (与原来的易于阅读和理解的版本相比,用线条分割它并没有真正给您带来任何优势。)
  • 我想我过去曾使用过它(刚学习 ?: 运算符时),它看起来确实很糟糕。目前,我将坚持使用 get 方法。当然,除非有人想出了一些神奇的东西。
【解决方案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
}

比起使用三元运算符的版本,我更喜欢这个版本的原因是,在阅读三元版本时,我必须在试图理解它时将其翻译成上面的代码。

如果我必须这样做,那我宁愿把它写下来给我,这样我就不需要花费精力了。也许这只是我,我很懒惰。 ;)

【讨论】:

  • 这是有效的语法,还是仅在更高版本的 C# 中可用?我目前只能使用VS2015。
  • @Oyyou 恐怕那是 C# 7 或更高版本(所以你需要 VS2017)
  • 啊,这很公平。我确实记得读过比使用丑陋且容易忘记的 Func. 更好的方法
  • @Oyyou 我添加了 Func&lt;string&gt; 东西以确保完整性。 ;)
猜你喜欢
  • 2022-12-17
  • 2019-06-18
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2021-07-31
相关资源
最近更新 更多