我遇到了一个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
,但是使用条件运算符的查询会在那里抛出一个扭结。
我错过了什么?
答案 0 :(得分:8)
您的测试表达式是这样关联的:
(x == "3" && false) ? false : true
而不是像这样:
x == "3" && (false ? false : true)
答案 1 :(得分:2)
您看到的是运营商优先权。你可以解决这个问题:
x == "3" && (false ? false : true)
&安培;&安培;优先级高于?:
答案 2 :(得分:1)
它计为(x == "3" && false) ? false : true
,这就是为什么你有一个奇怪的行为。
答案 3 :(得分:0)
我怀疑你的lambda评估为(x == 3 && false) ? false : true
,它将返回第一个元素,因为条件总是会计算为false。将括号括起来以获得更清晰的代码。