只读keyvaluepair

时间:2015-05-05 18:02:11

标签: vb.net list keyvaluepair

我创建了一个程序,它接受一些文件(Mp3)并更改其标签 最近我想添加一些新的Subs(例如:取出歌曲名称并将其中的每个字母都添加到其中)。问题是我使用列表及其项目为keyvaluepairs

Public MP3List As New List(Of KeyValuePair(Of String, String))

当我尝试编辑该列表中任何项目的键或值时,我收到错误(这是READONLY) 例如:

    For Each Song In MP3List
        Song.Key = "Something"
    Next

我添加这样的项目:

Private Function OpenAFile()
    Dim MP3List1 = MP3List
    Dim oFileDialog As New OpenFileDialog
    oFileDialog.Title = "Επέλεξε ένα MP3 Άρχειο"
    oFileDialog.Filter = "MP3 Files|*.mp3|All Files|*.*"
    oFileDialog.Multiselect = True
    Dim Path As String = ""
    Dim Name As String = ""
    Dim NewPair As New KeyValuePair(Of String, String)
    If oFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
        For Each sPath In oFileDialog.FileNames
            Path = New String(sPath)
            Name = New String(Strings.Split(Path, "\").ToList(Strings.Split(Path, "\").ToList.Count - 1))
            NewPair = New KeyValuePair(Of String, String)(Name, Path)
            If Not MP3List1.Contains(NewPair) Then MP3List1.Add(NewPair)
        Next
    End If

    Return MP3List1

End Function

所以这个想法是这样的:每次我按A按钮添加一首歌,它将运行OpenAFile()函数,然后工作正常。现在我想要更改密钥或值,我得到此错误

The error

感谢帮助,对不起英语感到抱歉

1 个答案:

答案 0 :(得分:0)

KeyValuePair中的密钥是只读的,因为它们通常用作哈希表中的密钥。更改密钥会导致您在散列中丢失项目的问题。

如果你想做这样的事情,你总是可以创建自己的数据类型来存储密钥和值。一个过于简化的例子如下。

Public Structure PathNamePair
    Public Property Path As String
    Public Property Name As String

    Public Sub New(path As String, name As String)
        Me.Path = path
        Me.Name = name
    End Sub
End Structure

我会注意到,为了使用Contains方法获得更好的性能,你还应该实现IEquatable(Of T),但这可能超出了这个问题的范围。我还要注意,使用可变的ValueType(Structure)并不是最佳做法。