LINQ Any — всегда возвращает false

#c# #linq

#c# #linq

Вопрос:

У меня есть сторонняя сетка, я использую LINQ для проверки всех строк в ней ( GetRows() ) — для проверки того, что конкретная ячейка ( _ObjectKey ) не содержит значения. Я хочу использовать Any для этого метод LINQ.

Но мое утверждение всегда возвращается false , даже если sentGrid оно содержит значение. Какие-либо очевидные ошибки?

 if (sentGrid.GetRows().Any(r => r.Cells[_ObjectKey].Value == theValue) == false)
  

Комментарии:

1. Я теряюсь со всеми негативами здесь, и я подозреваю, что они не особенно полезны. Я предлагаю вам изменить свой вопрос на: bool any = sentGrid.GetRows().Any(r => r.Cells[_ObjectKey].Value == theValue); , объясните ожидаемое значение и фактическое значение, а затем расскажите нам о типах всех задействованных значений. В частности, какой тип r.Cells[_ObjectKey].Value и какой тип theValue ? Возможно, вы должны использовать Object.Equals(r.Cells[_ObjectKey].Value, theValue) вместо этого?

2. Вы пробовали Equals вместо == ?

3. как насчет sentGrid.GetRows().All(r => r.Cells[_ObjectKey].Value != theValue) ? Это сработает для вас?

4. «Какие-нибудь очевидные ошибки?» Не то, что я вижу. Попробуйте написать для нас полный пример : я ожидаю, что вы сами найдете проблему в этом процессе.

5. Я бы рекомендовал sentGrid.GetRows() временно сохранить в отдельной переменной, чтобы вы могли проверять значения в отладчике. Или еще лучше, что-то вроде, var values = sentGrid.GetRows().Select(r => r.Cells[_ObjectKey].Value).ToList(); . Таким образом, вы можете хотя бы увидеть, что вы сравниваете.

Ответ №1:

Эта проблема возникла из-за сравнения двух типов объектов с использованием == вместо .Equals .

Окончательный код:

 // Add items to target grid if they're not already there
if(!sentGrid.GetRows().Any(r => r.Cells[_ObjectKey].Value.Equals(theValue)))
{
   sentGrid.AddItem(theValue);
}