【问题标题】:C# ternary operator List operatorC# 三元运算符 列表运算符
【发布时间】:2015-03-06 17:41:37
【问题描述】:

任何人都知道最快的三元运算。

label1.Text = Cclass.TestMe()
                    .Where(t => t.GFName == (textBox1.Text == "" 
                                              ? "GName" 
                                              : textBox1.Text))
                    .First()
                    .GFName == null ? 
              "Nothing" : 
              "Super";

我试图检查列表是否为空返回一些东西。所以编译器不会抛出异常或未处理的错误。

【问题讨论】:

  • 这段代码有什么问题?
  • 并非所有事情都需要在一个语句中完成......

标签: c# list operator-keyword ternary-operator


【解决方案1】:

这个异常原因First()。如果没有要返回的行,它将抛出异常。相反,您可以使用FirstOrDefault(),它将返回默认值(所有引用类型为NULL)。但是如果你想检查你的列表中是否有任何元素符合条件,那么你必须使用Any()扩展方法:

 return Cclass.TestMe()
                .Any(t => t.GFName == (textBox1.Text == "" ? "GName" : textBox1.Text)) ? 
        "Super" : 
        "Nothing";

顺便说一句,最好在查询之外设置文本:

var filteredText = textBox1.Text == "" ? "GName" : textBox1.Text;
return Cclass.TestMe().Any(t => t.GFName == filteredText) ? 
            "Super" : 
            "Nothing";

【讨论】:

  • @DStanley 是的,我猜))
  • 谢谢,我让它工作了。 @D斯坦利。我只是在练习三元,你说得对,多行检查代码很容易。但是我知道有一种方法可以做到这一点,在 Stack Exchange,我知道这里的许多编码人员都想尽一切可能升级他们的知识。感谢 Farhad 对 First FOD 和 Any Method 的详细解释。让它工作,现在为他们阅读相关方法:D
  • 我会在获得 15 声望后立即升级。需要投票:D
  • @Aizen 很高兴为您提供帮助。如果它解决了您的问题,您仍然可以标记为答案。祝你好运。
  • @Aizen 要将答案标记为已接受,请单击答案旁边的复选标记以将其从空心切换为绿色。
【解决方案2】:

如果我理解你的话,如果where 子句返回一些东西,你想返回一个值,如果没有返回另一个值。那将是:

label1.Text = Cclass.TestMe()
                    .Any(t => t.GFName == (textBox1.Text == "" 
                                              ? "GName" 
                                              : textBox1.Text)) ? 
              "Super" : 
              "Nothing";

如果这不是您想要的,那么重新排列您的代码以使用if 语句使其工作,然后使其更好。丑陋的工作代码总是比优雅的破代码好。

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2014-01-16
    • 2018-09-10
    相关资源
    最近更新 更多