在键值对中只读

Readonly in keyvaluepair

好吧,我创建了一个程序,它可以获取一些文件 (Mp3) 并更改它们的标签 最近我想添加一些新的 Subs(例如:取歌曲名称并将其中的每个字母都大写)。问题是我使用一个列表,它的项目是 keyvaluepairs

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

当我尝试编辑该列表中任何项目的键或值时出现错误(这是只读的) 示例:

    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() 并且它工作正常。现在我想更改键或值,但出现此错误

感谢您的帮助,抱歉英语不好

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

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

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),但这可能超出了这个问题的范围。我还会注意到,拥有一个 mutable.

的 ValueType(结构)并不是最佳实践