类属性中的visual basic collection(list)

时间:2014-01-01 10:26:03

标签: vb.net

我想要一个具有如下属性的vb类:

Public Class aClass

Private dict As Dictionary(Of String, Integer)

Public Sub New()
    dict = New Dictionary(Of String, Integer)
    dict.Add("something", 2)
    dict.Add("something other", 4)
End Sub

Public ReadOnly Property Prop As List(Of String)

    Get
        Dim newList As New List(Of String)
        For Each d As String In dict.Keys
            newList.Add(d)
        Next
        Return newList
    End Get

End Property

属性方法将遍历所有字典条目并将密钥添加到列表中。

如何在表单中调用此属性方法并在列表框中显示列表?

    Public Class Form1
Dim f As aClass = New aClass
Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()
    upDateView()

    ' Add any initialization after the InitializeComponent() call.

End Sub

Public Sub upDateView()
    ListBox1.Items.Clear()
    ListBox1.Items.Add(f.Prop)'This is where I get really stuck??

End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)    Handles Button1.Click

    f.addToDict(TextBox1.Text)'This method has been created
    upDateView()

End Sub
End Class

我已经搜索了谷歌超过一天半,但最后我已经承认要求一些帮助,我是新手所以请耐心等待这对你们来说很容易。

由于

凯文

2 个答案:

答案 0 :(得分:2)

你可以这样做:

ListBox.Items.AddRange(dicvtionary.Keys.ToArray())

希望这会有所帮助..

答案 1 :(得分:1)

我建议不要将列表作为属性公开,因为调用者可以更改列表。在您的示例中,这些更改不会反映在数据中,因此该功能对于调用者来说是无用的。如果呼叫者想要一个列表,他或她可以创建一个列表。如果您只想发布密钥的枚举,最安全的方法是创建类型为IReadOnlyCollection(Of T)的属性:

Public Class aClass

    Private dict As Dictionary(Of String, Integer)

    Public Sub New()
        dict = New Dictionary(Of String, Integer)
        dict.Add("something", 2)
        dict.Add("something other", 4)
    End Sub

    Public ReadOnly Property Prop As IReadOnlyCollection(Of String)
        Get
            Return dict.Keys.ToList().AsReadOnly()
        End Get    
    End Property
End Class 

这样,调用者就无法篡改列表项(在您的情况下,调用者在创建单独的列表时无法更改字典键的基础集合)。为了基于Keys创建列表,上面的示例使用ToList()扩展方法。然后,AsReadOnly()方法返回一个无法更改的只读列表。
要将项添加到ListBox,请使用以下代码:

ListBox1.Items.AddRange(cls.Prop.ToArray())

请注意,该代码涉及很多集合的转换(键 - > ToList - > AsReadOnly - > ToArray)。在这种情况下,它也可以替代将属性的类型更改为字符串数组(String()),并使用Keys.ToArray()作为唯一必要的转换。如果类的调用者在同一个程序集中,这是简化事情的好方法。