Linq где с троичными и скобками
У меня есть следующий запрос:
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 ответ
В C# троичный оператор имеет более низкий приоритет, чем условный оператор AND. Таким образом, без скобок И вычисляется перед троичным оператором, и у вас есть троичный оператор, который проверяет почтовый индекс И страну. Т.е. по умолчанию
( checkPostcode && countryNotNull) ? true : checkCountry
Когда вы добавляете скобки, вы разделяете троичный оператор, который проверяет страну по проверке почтового индекса.
checkPostcode && (countryNotNull ? true : checkCountry)