在键值对中只读
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(结构)并不是最佳实践
好吧,我创建了一个程序,它可以获取一些文件 (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(结构)并不是最佳实践