MarqW Ответов: 2

Проблема с использованием лямбды .Где()


У меня странная проблема с каким-то кодом. Если я использую этот код, он падает на тамошние custParts.Где(функция(cv), с ошибкой:
Делегат метода экземпляра не может иметь null 'this'

Dim custParts As CustomerPartNumbers = New CustomerPartNumbers() ' Inherits ComponentModel.BindingList(Of CustomerPartNumber), which is just another data class
Dim queryString As String = "Wallpaper"
custParts.Load("DummyCustomer")
If Not custParts Is Nothing Then
  Dim qS As String = queryString
  Dim cp As CustomerPartNumber
  For Each cp In custParts.Where(Function(cv) cv.CustomerPartNumber = qS)
    Dim cpPN As String = cp.PartNumber
    If prodResults.Where(Function(z) z.PartNumber = cpPN).Count = 0 Then
      prodResults.Add(New Hathaway.Library.Part(cpPN))
    End If
  Next
End If


Однако, если я помещаю лямбду в переменную, она, кажется, работает без проблем.

Dim custParts As CustomerPartNumbers = New CustomerPartNumbers() ' Inherits ComponentModel.BindingList(Of CustomerPartNumber), which is just another data class
Dim queryString As String = "Wallpaper"
custParts.Load("DummyCustomer")
If Not custParts Is Nothing Then
  Dim qS As String = queryString
  Dim xxx As Object = custParts.Where(Function(cv) cv.CustomerPartNumber = qS)
  Dim cp As CustomerPartNumber
  For Each cp In xxx
    Dim cpPN As String = cp.PartNumber
  Next
End If


У кого-нибудь есть идеи, почему он это делает? и почему я не могу просто за Рор каждый против моей лямбды??

Спасибо

Редактировать:
Как ни странно, это работает:

Dim zxcustParts As CustomerPartNumbers = New CustomerPartNumbers()
zxcustParts.Load("DummyCustomer")
Dim zxqueryString As String = "Wallpaper"
For Each zxcustPart In zxcustParts.Where(Function(zxcp) zxcp.CustomerPartNumber = zxqueryString)
  Dim cpPN As String = zxcustPart.PartNumber
Next


Правка 2:
Ладно, я действительно понял, что это такое... Моя кодовая вставка неудачного кода на самом деле пропустила бит, который вызвал ошибку (хотя я уверен, что просто C/P'D прямо из источника). Так что я обновил это.

Проблема в том, чтобы попытаться сделать второй ".Где" внутри а для каждого из первых.

2 Ответов

Рейтинг:
2

Guillermo Perez

The problem is that the item passed by the lambda expression is null... think about this

ITEM1
name:Guillermo
age:14

ITEM2
name:null
age:null

ITEM3
name:Jordan
age:18

now if I do my where:

var x = mylist.Where(w => w.name.Contains("Jor"))

the error will show, because the item name is null... I resolved it by using a test first as follow:

var x = mylist.Where(w => w.name != null && w.name.Contains("Jor"))

hope this helps!


Richard MacCutchan

Уже отвечал восемь лет назад.

Guillermo Perez

да, но ответ неверен, Решение 1 говорит, что вы не можете использовать where внутри цикла for, что неверно...

Richard MacCutchan

Есть много текущих вопросов, которые ждут ответов, а не воскрешения мертвых.

Guillermo Perez

мертвые? никто не ответил на это правильно (даже вы!), и это случилось со мной вчера... что происходит?

Рейтинг:
15

MarqW

См. правку 2 - вы, по-видимому, не можете вызвать a .Где внутри цикла "для каждого In .Where"