【问题标题】:?: Conditional Operator in LINQ not working as expected?: LINQ 中的条件运算符未按预期工作
【发布时间】:2012-04-29 05:21:41
【问题描述】:

我的一个 LINQ 查询出现问题,因此我在 LINQPad 中制作了它的简化版本来帮助我。问题是,我不明白为什么它仍然没有做我认为应该做的事情......

var list = "1 2 3 4".Split();
var result = list.FirstOrDefault(x =>
                    x == "3"
                    && true);
result.Dump();

这会回馈3,就像人们假设的那样。
但是,当我运行它时:

var list = "1 2 3 4".Split();
var result = list.FirstOrDefault(x =>
                    x == "3"
                    && false ? false : true);

我收到1 回复。最后一行是实际代码的简化。这两个示例都应该在最后一行给出true,这将返回3,但是带有条件运算符的查询在那里抛出了一个扭结。

我错过了什么?

【问题讨论】:

  • +1:在最初阅读这个问题时,我皱起眉头想知道,“我错过了什么?为什么你会期望从第二个例子中得到 1?x == "3" && false 总是评估为 false ...” 不考虑运算符优先级可能会双向。

标签: c# linq conditional conditional-operator


【解决方案1】:

您的测试表达式是这样关联的:

(x == "3" && false) ? false : true

而不是这样:

x == "3" && (false ? false : true)

【讨论】:

  • 哇。这是CS101。我很惭愧。谢谢。
  • @G_M C-方言 101。运算符优先级因语言而异。
  • @Mystere Man - 我做到了。我不得不等 10 分钟才让我这么做!
【解决方案2】:

它算作(x == "3" && false) ? false : true,这就是你有奇怪行为的原因。

【讨论】:

    【解决方案3】:

    您所看到的是由于运算符优先级。解决方法是将条件包装在括号中:

    x == "3" && (false ? false : true)
    

    && 的优先级高于 ?:

    【讨论】:

      【解决方案4】:

      我怀疑您的 lambda 评估结果为 (x == 3 && false) ? false : true,它将返回第一个元素,因为条件将始终评估为 false。加括号让代码更清晰。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-13
        • 2020-12-24
        • 2015-05-11
        • 2019-06-20
        • 2021-04-13
        • 1970-01-01
        • 2020-12-29
        • 2021-04-30
        相关资源
        最近更新 更多