2015-05-05 3 views
-1

Ну, я создал программу, которая принимает некоторые файлы (Mp3) и меняет их теги Недавно я хотел добавить некоторые новые Subs (например: взять название песни и сделать каждую букву в ней upercase). Проблема заключается в том, что я использую список с его позиций, чтобы быть keyvaluepairsReadonly in keyvaluepair

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 

Таким образом, идея заключается в следующем: Каждый раз, когда я нажимаю кнопку, чтобы добавить песню он будет запускать функцию OpenAFile(), и он работает нормально-й ru. Теперь, когда я хочу изменить ключ или значение я получаю эту ошибку

The error

Спасибо за помощь и извините за плохой английский

+0

Ключ в KVP предназначен для идентификации конкретной записи и не должен изменяться (и если бы этот цикл выполнял все ваши элементы, у них был бы тот же ключ, и ваш код не мог бы сказать один из другого). Вы можете исправить ключ, прежде чем добавлять элемент. Однако изменение ключевого слова не будет обновлять тег MP3. – Plutonix

+0

, возможно, не заполняет ключ до тех пор, пока вы не узнаете, что это такое ... или удалите его и добавьте новый с правильной информацией ... или сохраните ключ одинаковым, но значение будет настраиваемым объектом, в котором хранятся все, что вы может понадобиться знать ... – Jeremy

+0

Ну, я хочу иметь возможность менять ключ всякий раз, когда я хочу, потому что я хочу это сделать. (Я знаю, что такое мой ключ, но я хочу, чтобы его можно было изменить) – sheach

ответ

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 

Замечу, что для того, чтобы получить более высокую производительность с вашим Содержит метод, вы должны также реализовать IEquatable (Of T), но это, вероятно, выходит за рамки этого вопроса. Я также отмечу, что не рекомендуется использовать переменную ValueType (Structure).

+0

Приведите пример, если возможно – sheach

Смежные вопросы