System.NullReferenceException при выполнении для…Каждый в массиве словарей

#vb.net #dictionary

#vb.net #словарь

Вопрос:

Возможно, я неправильно использую термин «Массив словарей», поэтому, пожалуйста, сообщите мне правильную терминологию, если это так. В моем приведенном ниже коде я имею в виду массив словарей Dim PdfIndividual(individualCount) .

По сути, я пытаюсь заставить лямбда-функцию возвращать счетчик после того, как она перебирает мой массив словарей и находит значение, для которого я пытаюсь получить счетчик.

Я ограничен рамками, в которых в конечном итоге будет выполняться этот код, поэтому я в первую очередь использую лямбда-функцию. Поэтому, хотя я уверен, что представленный мной код может быть не идеальным, мне действительно просто интересно понять, почему возникает ошибка, а не просто заставить ее работать.

 Dim relationshipTypeCount As Func(Of Dictionary(Of String, String)(), String, Integer) =
    Function(PdfIndividualArray, relationshipType)
        Dim dictValue As String = ""
        Dim relTypeCountResult As Integer = 0
        For Each pdfIndDict As Dictionary(Of String, String) In PdfIndividualArray
            pdfIndDict.TryGetValue("RelationshipType", dictValue)
            If dictValue = relationshipType Then
                relTypeCountResult  = 1
            End If
        Next
        Return relTypeCountResult
    End Function

Dim individualCount As Integer = 5
Dim relType As String = ""
Dim PdfIndividual(individualCount) As Dictionary(Of String, String)

For i As Integer = 0 To individualCount
    If i = 0 Then
         relType = "primary"
    ElseIf i <= 3 Then
         relType = "secondary"
    ElseIf i > 3 Then
         relType = "guest"
    End If
    PdfIndividual(i) = New Dictionary(Of String, String)
    PdfIndividual(i).Add("RelationshipType", relType)

    Dim relCount As Integer = relCount = relationshipTypeCount(PdfIndividual, relType)
Next
 

Ошибка возникает в элементе словаря в For …Каждая из моих лямбда-функций relationshipTypeCount .

Текст ошибки:

System.NullReferenceException: «Ссылка на объект не установлена для экземпляра объекта».

pdfIndDict ничего не значил.

Скриншот исключения ошибки введите описание изображения здесь

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

1. Отладьте свой код.

2. Спасибо за комментарий @jmcilhinney. Хотя я провел некоторую отладку, чтобы добраться до того места, где я опубликовал свой первоначальный вопрос, я понимаю, что не прошел через это должным образом. Еще один взгляд, проходящий через лямбда-функцию, и я думаю, что вижу, в чем проблема.

Ответ №1:

В зависимости от вашей цели.ЧИСТАЯ версия, вы можете использовать следующую нулевую условную форму, которая является более краткой:

 For Each pdfIndDict As Dictionary(Of String, String) In PdfIndividualArray
    pdfIndDict?.TryGetValue("RelationshipType", dictValue)
    If dictValue = relationshipType Then relTypeCountResult  = 1
Next pdfIndDict 
 

Кстати, вы также можете использовать следующую форму проверки null:

 If pdfIndDict IsNot Nothing Then ...
 

Ответ №2:

После дальнейшей отладки я понял, что моя проблема заключалась в том, что я перебирал «массив», в котором было 6 элементов, однако 5 элементов были ничем во время первого вызова лямбда-функции. Поэтому мне просто нужно было добавить проверку того, что элемент словаря, с которым я работал, не был ничем.

 For Each pdfIndDict As Dictionary(Of String, String) In PdfIndividualArray
    If Not IsNothing(pdfIndDict) Then
        pdfIndDict.TryGetValue("RelationshipType", dictValue)
        If dictValue = relationshipType Then
            relTypeCountResult  = 1
        End If
    End If
Next