【问题标题】:.net dictionary inside dictionary: adding new items to the inner dictionary.net 字典内部字典:向内部字典添加新项目
【发布时间】:2014-09-14 17:17:57
【问题描述】:

我有一个字典作为另一个字典的值部分结构的字段之一,这样一门课程可以包含多个班级,每个班级都有自己的老师和学生,如下所示:

Structure course
    Dim description As String
    Structure classs
        Dim teacherCode As String
        Dim studentIDs() As Integer
    End Structure
    Dim classes As Dictionary(Of String, classs) 'key=classCode
End Structure

Structure courseKey
    Dim name As String
    Dim yearLevel As Short
End Structure

Dim courses As New Dictionary(Of courseKey, course)

我可以使用带有 courses.Add(courseKey, course) 的空类子字典构造一个 courseKey 并创建一个空的课程字典条目,但我不知道如何(或者,实际上,如果可能的话)创建一个带有非空类子词典的新课程词典条目。我希望能够做这样的事情来创建一个类,然后将它添加到课程中,但是得到一个 NullReferenceException (即使课程(courseKey)引用了适当的字典项,并且当 classCode 是一个有效的字符串和classes 是 classes 结构的有效实例,其中包含数据)

courses(courseKey).classes.Add(classCode, classs)

我是否遗漏了一些明显的东西?我打算拥有一些这样的数据结构,其中一些在另一个字典中包含多个字典。如果这不可能,也许有更好的方法?

【问题讨论】:

  • 什么表达式为空?找出。我很想把它作为规范 NRE 问题的副本关闭。我看不出这个案子有什么特别之处。

标签: .net vb.net dictionary data-structures


【解决方案1】:

课程类中的类字典需要初始化。您可以在构造函数中执行此操作:

Structure course

    ...

    Public Sub New(description As String)

        Me.description = description
        classes = New Dictionary(Of String, classs)

    End Sub

    ...

End Structure

【讨论】:

    【解决方案2】:

    NullReferenceException always means the same thing。在这种情况下,您还没有在 course 结构中实例化 classes 字典。

    Dim classes As Dictionary(Of String, classs) 'key=classCode
    

    为了比较,您已经使用 New 关键字实例化了 courses 字典。

    Dim courses As New Dictionary(Of courseKey, course)
    

    通常您会以相同的方式创建 classes 字典,但在这种情况下,它位于 structure 中,并且不允许在结构中使用默认构造函数或成员初始值设定项。

    你需要在某个地方初始化你的字典,所以你有几个选择。可能最简单的方法是将其包装到一个属性中:

    Private _classes As Dictionary(Of String, [class])
    
    Public ReadOnly Property Classes As Dictionary(Of String, [class])
        Get
            If _classes Is Nothing Then _classes = New Dictionary(Of String, [class])()
            Return _classes
        End Get
    End Property
    

    如果您的代码可能是多线程的,您可能希望以不同的方式处理此问题,但这会在 course 结构上提供一个 Classes 属性,如果它不存在,它将初始化其私有支持成员。

    (顺便说一句,我把名字classs改成了class,并用方括号括起来以避开名字。)

    【讨论】:

    • 太棒了,非常感谢。这正是我需要知道的。
    猜你喜欢
    • 2018-07-06
    • 2016-10-29
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2023-02-25
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多