Zachary Wheeler
Zachary Wheeler

Reputation: 5

vb,net my collection property in my class is throwing an error

I am learning about collections, I have a Person class

Imports System
Imports System.Collections.Generic
Imports System.Text

Public Class Person
    Public Sub New()

    End Sub

Public Sub New(ByVal id As Integer, ByVal first_name As String, ByVal mid_name As String, ByVal last_name As String, ByVal age As Short, ByVal sex As Char)
    Me.p_id = id
    Me.first_name = first_name
    Me.mid_name = mid_name
    Me.last_name = last_name
    Me.p_age = age
    Me.p_sex = sex
End Sub

Private p_id As Integer = -1
Private first_name As String = String.Empty
Private mid_name As String = String.Empty
Private last_name As String = String.Empty
Private p_age As Short = 0
Private p_sex As Nullable(Of Char) = Nothing

Public Property ID() As Integer
    Get
        Return p_id
    End Get
    Set(ByVal value As Integer)
        p_id = value
    End Set
End Property

Public Property FirstName() As String
    Get
        Return first_name
    End Get
    Set(ByVal value As String)
        first_name = value
    End Set
End Property

Public Property MiddleName() As String
    Get
        Return mid_name
    End Get
    Set(ByVal value As String)
        mid_name = value
    End Set
End Property

Public Property LastName() As String
    Get
        Return last_name
    End Get
    Set(ByVal value As String)
        last_name = value
    End Set
End Property

Public Property Age() As Short
    Get
        Return p_age
    End Get
    Set(ByVal value As Short)
        p_age = value
    End Set
End Property

Public Property Sex() As Nullable(Of Char)
    Get
        Return p_sex
    End Get
    Set(ByVal value As Nullable(Of Char))
        p_sex = value
    End Set
End Property
End Class

and an Employee Class where I define a Person property

Imports System
Imports System.Collections.Generic
Imports System.Text

Public Class Employee
    Public Sub New()

    End Sub

Public Sub New(ByVal id As Integer, ByVal companyName As String, ByVal office As String, colPerson As Person)
    'Me._employeeid = id
    'Me._companyName = companyName
    'Me._office = office
End Sub

Private _employeeid As Integer = -1
Private _companyName As String = String.Empty
Private _office As String = String.Empty

Public Property Empoyee_ID() As Integer
    Get
        Return _employeeid
    End Get
    Set(ByVal value As Integer)
        _employeeid = value
    End Set
End Property

Public Property CompanyName() As String
    Get
        Return _companyName
    End Get
    Set(ByVal value As String)
        _companyName = value
    End Set
End Property

Public Property Office() As String
    Get
        Return _office
    End Get
    Set(ByVal value As String)
        _office = value
    End Set
End Property

Property colPerson As List(Of Person)
End Class

How can i populate the persons class as well

Sub Main()
    Dim pList As List(Of Person) = New List(Of Person)()

    Dim thePerson As New List(Of Person) From
    {
        New Person With {.Age = 29, .FirstName = "John", .LastName = "Shields", .MiddleName = "", .Sex = "M", .ID = 1},
        New Person With {.Age = 34, .FirstName = "Mary", .LastName = "Matthew", .MiddleName = "L", .Sex = "F", .ID = 2},
        New Person With {.Age = 55, .FirstName = "Amber", .LastName = "Carl", .MiddleName = "P", .Sex = "M", .ID = 3},
       New Person With {.Age = 12, .FirstName = "Kathy", .LastName = "Berry", .MiddleName = "O", .Sex = "F", .ID = 4}
    }
    'pList.Add(New Person(1, "John", "", "Shields", 29, "M"c))
    'pList.Add(New Person(2, "Mary", "Matthew", "Jacobs", 35, "F"c))
    'pList.Add(New Person(3, "Amber", "Carl", "Agar", 25, "M"c))
    'pList.Add(New Person(4, "Kathy", "", "Berry", 21, "F"c))
    'pList.Add(New Person(5, "Lena", "Ashco", "Bilton", 33, "F"c))
    'pList.Add(New Person(6, "Susanne", "", "Buck", 45, "F"c))
    'pList.Add(New Person(7, "Jim", "", "Brown", 38, "M"c))
    'pList.Add(New Person(8, "Jane", "G", "Hooks", 32, "F"c))
    'pList.Add(New Person(9, "Robert", "", "", 31, "M"c))
    'pList.Add(New Person(10, "Cindy", "Preston", "Fox", 25, "F"c))
    'pList.Add(New Person(11, "Gina", "", "Austin", 27, "F"c))
    'pList.Add(New Person(12, "Joel", "David", "Benson", 33, "M"c))
    'pList.Add(New Person(13, "George", "R", "Douglas", 55, "M"c))
    'pList.Add(New Person(14, "Richard", "", "Banks", 22, "M"c))
    'pList.Add(New Person(15, "Mary", "C", "Shaw", 39, "F"c))
    '

    'loop through the list
    ' PrintOnConsole(pList, "1. --- Looping through all items in the List<T> ---")
    '
    'Filtering List(T) using a single condition - (Age > 35)
    'Dim filterOne As List(Of Person) = pList.FindAll(Function(p As Person) p.Age > 35)
    'PrintOnConsole(filterOne, "2. --- Filtering List<T> on single condition (Age > 35) ---")
    ''

    '' Filtering List(T) on multiple conditions (Age > 35 and Sex is Female)
    'Dim filterMultiple As List(Of Person) = pList.FindAll(Function(p As Person) p.Age > 35 AndAlso p.Sex = "F"c)
    'PrintOnConsole(filterMultiple, "3. --- Filtering List<T> on multiple conditions (Age > 35 and Sex is Female) ---")
    ''

    ''Sorting List(T) (Sort on FirstName)
    'Dim sortFName As List(Of Person) = pList
    'sortFName.Sort(Function(p1 As Person, p2 As Person) p1.FirstName.CompareTo(p2.FirstName))
    'PrintOnConsole(sortFName, "4. --- Sort List<T> (Sort on FirstName) ---")
    '
    'Sorting List(T) descending (Sort on LastName descending)
    'Dim sortLNameDesc As List(Of Person) = pList
    'sortLNameDesc.Sort(Function(p1 As Person, p2 As Person) p2.LastName.CompareTo(p1.LastName))
    'PrintOnConsole(sortLNameDesc, "5. --- Sort List<T> descending (Sort on LastName descending) ---")

    ''Add new List(T) to existing List(T)
    'Dim newList As List(Of Person) = New List(Of Person)()
    'newList.Add(New Person(16, "Geoff", "", "Fisher", 29, "M"c))
    'newList.Add(New Person(17, "Samantha", "Carl", "Baxer", 32, "F"c))
    'pList.AddRange(newList)
    'PrintOnConsole(pList, "6. --- Add new List<T> to existing List<> ---")

    ''Remove multiple items from List(T) based on condition (remove male employees)
    'Dim removeList As List(Of Person) = pList
    'removeList.RemoveAll(Function(p As Person) p.Sex = "M"c)
    'PrintOnConsole(removeList, "7. --- Remove multiple items from List<> based on condition ---")
    '' Create Read Only List(T)
    'Console.WriteLine("Create Read Only List<>")
    'Dim personReadOnly As IList(Of Person) = pList
    'Console.WriteLine("Before - Is List Read Only? True or False : " & personReadOnly.IsReadOnly)
    'personReadOnly = pList.AsReadOnly()
    'Console.WriteLine("After - Is List Read Only? True or False : " & personReadOnly.IsReadOnly & "</br>")

    '
    'Dim pList1 As New Person

    Dim emp As New List(Of Employee)
    Dim r As New Employee
    r.CompanyName = "zac"
    r.Office = "home"
    r.Empoyee_ID = 1
    'Dim pList1 = New Person(1, "John", "", "Shields", 29, "M"c)

    r.colPerson.Add(New Person(1, "John", "", "Shields", 29, "M"c))---> Gives error

    emp.Add(r)
    '
    Dim i As New Employee
    i.CompanyName = "zac1"
    i.Office = "home1"
    i.Empoyee_ID = 2

    i.colPerson.Add(New Person(3, "Amber", "Carl", "Agar", 25, "M"c))
    pList.Add(New Person(4, "Kathy", "", "Berry", 21, "F"c))
    emp.Add(i)
    '
    Dim t As New Employee
    t.CompanyName = "zac2"
    t.Office = "home2"
    t.Empoyee_ID = 2

    pList.Add(New Person(5, "Lena", "Ashco", "Bilton", 33, "F"c))
    pList.Add(New Person(6, "Susanne", "", "Buck", 45, "F"c))
    emp.Add(t)


    For Each item In emp
        'item.CompanyName = "zac"
        'item.Office = "home"

        'item.colperson.Where(Function(x) x.ID = 17)
        'Console.WriteLine("employee with person collection: " & item.CompanyName & "   " & item.Office & "    " & item.colperson.Where(Function(x) x.ID = 17).ToString & "</br>")
        Console.WriteLine("employee with person collection: " & item.CompanyName & "   " & item.Office & "</br>")
    Next
End Sub

Upvotes: 0

Views: 183

Answers (1)

Caius Jard
Caius Jard

Reputation: 74605

r.colPerson.Add(New Person(1, "John", "", "Shields", 29, "M"c))---> Gives error

It gives an error because even though colPerson is declared to be capable of holing a list of people, it hasn't actually been set to be a list of people, so it's currently Nothing, and you can't call methods on something that is Nothing

Property colPerson As New List(Of Person)
                      ^^^

Add a New directive to ensure it's declared and initialized to an instance of a List

Also, please:

  • Don't put "col" in names
  • Use a plural name for List(Of Thing) - this is a list of person so it should at least be called People, but also perhaps state what kind of people they are. For example if this Employee was recommended by a few people, call it RcommendedByPeople
  • Only use Collection in a name if you're writing a class that is a collection, such as Microsoft did when they wrote MatchCollection - a collection of regular expression Matches
  • Be definite about whether the property is public, private etc

i.e.

Public Property RcommendedByPeople As New List(Of Person)

Upvotes: 1

Related Questions