我创建了一个程序,它接受一些文件(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()函数,然后工作正常。现在我想要更改密钥或值,我得到此错误
感谢帮助,对不起英语感到抱歉
答案 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)并不是最佳做法。