Рейтинг:
1
Karthik_Mahalingam
Для nullable
Типы использования Value
собственность
if (cities.Count(x => x.Chosen.HasValue ? x.Chosen.Value :false) == 0)
Richard Deeming
То Value
собственность бросит InvalidOperationException
если значение равно null
.
Karthik_Mahalingam
Нет, это не так
общественного класса MyClass
{
общественная bool? Выбранные { получить; набор; }
}
protected void Page_Load(отправитель объекта, EventArgs e)
{
Список<класса MyClass&ГТ; городов = новый список<класса MyClass&ГТ;();
города.Add (new MyClass () { Chosen = true });
города.Add (new MyClass () { Chosen = false });
города.Add (new MyClass () { Chosen = null });
Если (города.Граф (x = & gt; x.выбран.Свойство hasvalue ? х.Выбрали.Значение: false) = = 0)
{
}
}
Richard Deeming
Да, это так.
Код в вашем комментарии и во втором примере не имеет доступа к Value
собственность, если это null
Троичный оператор заботится об этом - хотя, вероятно, было бы чище использовать его x.GetValueOrDefault()
вместо.
Но код в вашем первом примере делает это:
cities.Add(new MyClass { Chosen = null });
if (cities.Count(c => c.Chosen.Value) == 0)
...
Karthik_Mahalingam
Я согласен с этим " x. GetValueOrDefault()"
но код в комментарии работает нормально.
Пожалуйста, проверьте это.
тогда для чего используется свойство". HasValue"?
Richard Deeming
Да, как я уже сказал, код в вашем комментарии работает нормально.
Но первый пример в вашем первоначальном ответе не.
Если какой-либо город имеет свой Chosen
свойство установлено в null
, первый пример в вашем первоначальном ответе потерпит неудачу с InvalidOperationException
.
Но я вижу, что теперь вы удалили этот пример. :)
Karthik_Mahalingam
Я полностью согласен с этим комментарием, то есть я поставил "с проверкой" и опубликовал 2-й пример.
однако сейчас я удалил первый пример, чтобы избежать хаоса в ОП.
:)
Забавная Драма :)
Karthik_Mahalingam
Я действительно удивлен вашим вопросом.
Richard Deeming
Почему? Что плохого в том, чтобы указать на потенциальное исключение из кода в решении?
Karthik_Mahalingam
с самого начала возникло недопонимание между примерами 1 и 2 :)
Игнорировать это
Рейтинг:
1
David_Wimbley
Ваша проблема заключается в том, что выбранное вами свойство класса city имеет тип bool? вместо була. типа bool? == nullable boolean в этом случае вы не можете использовать его так, как вы это делаете, из-за возможности того, что значение равно null.
Некоторые из ваших вариантов следующие.
// This option uses the null coalesing operator and the one i would suggest
if (cities.Count(m => m.Chosen ?? false) == 0)
{
}
//Direct comparison to true
if (cities.Count(m => m.Chosen == true) == 0)
{
}
//Long form version of the first example provided. Checking for HasValue first to prevent null comparison
if (cities.Count(m => m.Chosen.HasValue ? m.Chosen.Value : false) == 0)
{
}
Рейтинг:
0
Richard Deeming
В дополнение к решению 1, Вы не должны использовать Count
если вы просто хотите определить, содержит ли последовательность какие-либо элементы, соответствующие условию. Воспользуйся Какой-нибудь[^] или Все[^] вместо:
if (!cities.Any(m => m.Chosen == true))
{
...
}
if (cities.All(m => m.Chosen != true))
{
...
}
То
Any
метод вернется, как только найдет элемент, соответствующий условию.
То
All
метод вернется, как только найдет элемент, который
Не соответствуют условию.
То
Count
метод всегда должен будет перечислять всю входную последовательность.