Linq哪里有三元和括号

时间:2015-04-28 08:06:22

标签: c# linq ternary

我有以下查询:

return Postcodes
            .Where(
                s => s.Postcode.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) > -1 &&
                string.IsNullOrEmpty(country) ? true : s.CountryRegionID.Equals(country, StringComparison.InvariantCultureIgnoreCase)
            )
            .Select(p => new { label = p.Postcode, value = p.RecID })
            .ToList();

现在我原本希望这会返回所有匹配国家/地区和邮政编码的邮政编码但由于某种原因它只匹配该条款,如果国家/地区为空,然后如果国家/地区不为空,则忽略该条款并且只匹配国家。

如果我在三元组周围放置括号:

return Postcodes
            .Where(
                s => s.Postcode.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) > -1 &&
                (string.IsNullOrEmpty(country) ? true : s.CountryRegionID.Equals(country, StringComparison.InvariantCultureIgnoreCase))
            )
            .Select(p => new { label = p.Postcode, value = p.RecID })
            .ToList();

然后它完全按照我的预期运作。为什么额外的括号对有所不同,因为代码分析总是抱怨我把括号括在三元组周围?

1 个答案:

答案 0 :(得分:7)

在C#中,三元运算符的优先级低于条件AND运算符。因此,没有括号并在三元运算符之前进行评估,并且您有三元运算符来检查邮政编码和国家/地区。即默认情况下

( checkPostcode && countryNotNull) ? true : checkCountry

添加括号时,拆分三元运算符,从邮政编码检查中检查国家/地区

checkPostcode && (countryNotNull ? true : checkCountry)

请参阅7.2.1 Operator precedence and associativity