2016-07-05 3 views
1

Как я могу конвертировать {{"variable", "default value"},{"integer","123"}} как вНевозможно инициализировать словарь с переменной массива

Public PredefinedVariables As New ReadOnlyDictionary(Of String, String) ({{"variable", "default value"},{"integer","123"}}) 

в IDictionary(Of String, String)?

(Может быть, вы должны прочитать реализацию ReadOnlyDictionary ниже первого)

Sub New(array As Array) 
    _dictionary = New Dictionary(Of TKey, TValue) From array 
End Sub 

не будет работать для меня из-за End of statement expected в From array.

Так что, я думаю, что только методы для преобразования массива в IDictionary, переписать массив KeyValuePair() для инициализации _dictionary, или объявить класс, который реализует IDictionary и использовать массив для его инициализации. Однако первые два кажется невозможным, и я не нашел класс, который подходит в третьем условии.

Класс ReadOnlyDictionary (Я использую .NET 3.5 для поддержания совместимости с Win7 В .NET ReadOnlyDictionary имеющийся только в .NET 4.0+.):

Public Class ReadOnlyDictionary(Of TKey, TValue) 
    Inherits ReadOnlyCollectionBase 
    Implements IDictionary(Of TKey, TValue), 
    IEmptyInterface, 'IDictionary, IReadOnlyDictionary(Of TKey, TValue),ISerializable, IDeserializationCallback 
    ICollection(Of KeyValuePair(Of TKey, TValue)), IEnumerable(Of KeyValuePair(Of TKey, TValue)), IEnumerable 
    Private ReadOnly _dictionary As IDictionary(Of TKey, TValue) 

    Public Sub New() 
     _dictionary = New Dictionary(Of TKey, TValue)() 
    End Sub 

    Public Sub New(dictionary As IDictionary(Of TKey, TValue)) 
     _dictionary = New Dictionary(Of TKey, TValue)(dictionary) 
    End Sub 

    Public Sub New(dictionary As IDictionary(Of TKey, TValue), comparer As IComparer(Of TKey)) 
     _dictionary = New Dictionary(Of TKey, TValue)(dictionary, comparer) 
    End Sub 

#Region "IDictionary<TKey,TValue> Members" 

    Private Sub IDictionary_Add(key As TKey, value As TValue) Implements IDictionary(Of TKey, TValue).Add 
     Throw ReadOnlyException() 
    End Sub 

    Public Function ContainsKey(key As TKey) As Boolean Implements IDictionary(Of TKey, TValue).ContainsKey 
     Return _dictionary.ContainsKey(key) 
    End Function 

    Public ReadOnly Property Keys() As ICollection(Of TKey) Implements IDictionary(Of TKey, TValue).Keys 
     Get 
      Return _dictionary.Keys 
     End Get 
    End Property 

    Private Function IDictionary_Remove(key As TKey) As Boolean Implements IDictionary(Of TKey, TValue).Remove 
     Throw ReadOnlyException() 
    End Function 

    Public Function TryGetValue(key As TKey, ByRef value As TValue) As Boolean Implements IDictionary(Of TKey, TValue).TryGetValue 
     Return _dictionary.TryGetValue(key, value) 
    End Function 

    Public ReadOnly Property Values() As ICollection(Of TValue) Implements IDictionary(Of TKey, TValue).Values 
     Get 
      Return _dictionary.Values 
     End Get 
    End Property 

    Public ReadOnly Property Item(key As TKey) As TValue 
     Get 
      Return _dictionary(key) 
     End Get 
    End Property 

    Default Public Property IDictionary_Item(key As TKey) As TValue Implements IDictionary(Of TKey, TValue).Item 
     Get 
      Return Me(key) 
     End Get 
     Set 
      Throw ReadOnlyException() 
     End Set 
    End Property 

#End Region 

#Region "ICollection<KeyValuePair<TKey,TValue>> Members" 

    Private Sub ICollection_Add(item As KeyValuePair(Of TKey, TValue)) Implements ICollection(Of KeyValuePair(Of TKey, TValue)).Add 
     Throw ReadOnlyException() 
    End Sub 

    Private Sub ICollection_Clear() Implements ICollection(Of KeyValuePair(Of TKey, TValue)).Clear 
     Throw ReadOnlyException() 
    End Sub 

    Public Function Contains(item As KeyValuePair(Of TKey, TValue)) As Boolean Implements ICollection(Of KeyValuePair(Of TKey, TValue)).Contains 
     Return _dictionary.Contains(item) 
    End Function 

    Public Sub CopyTo(array As KeyValuePair(Of TKey, TValue)(), arrayIndex As Integer) Implements ICollection(Of KeyValuePair(Of TKey, TValue)).CopyTo 
     _dictionary.CopyTo(array, arrayIndex) 
    End Sub 

    Public Overrides ReadOnly Property Count() As Integer Implements ICollection(Of KeyValuePair(Of TKey, TValue)).Count 
     Get 
      Return _dictionary.Count 
     End Get 
    End Property 

    Public ReadOnly Property IsReadOnly() As Boolean Implements ICollection(Of KeyValuePair(Of TKey, TValue)).IsReadOnly 
     Get 
      Return True 
     End Get 
    End Property 

    Private Function ICollection_Remove(item As KeyValuePair(Of TKey, TValue)) As Boolean Implements ICollection(Of KeyValuePair(Of TKey, TValue)).Remove 
     Throw ReadOnlyException() 
    End Function 

#End Region 

#Region "IEnumerable<KeyValuePair<TKey,TValue>> Members" 

    Public Function GetEnumerator() As IEnumerator(Of KeyValuePair(Of TKey, TValue)) Implements IEnumerable(Of KeyValuePair(Of TKey, TValue)).GetEnumerator 
     Return _dictionary.GetEnumerator() 
    End Function 

#End Region 

#Region "IEnumerable Members" 

    Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator 
     Return GetEnumerator() 
    End Function 

#End Region 

    Private Shared Function ReadOnlyException() As Exception 
     Return New NotSupportedException("This dictionary is read-only") 
    End Function 

End Class 

Interface IEmptyInterface 

End Interface 

Несколько изменений в ответ Uno в:

Public Sub New(Key As TKey, Value As TValue) 
     Me.New 
     _dictionary.Add(Key, Value) 
    End Sub 

    Public Sub New(KeyValuePairs As KeyValuePair(Of TKey, TValue)()) 
     Me.New 
     _dictionary = KeyValuePairs.ToDictionary(Function(x) x.Key, Function(x) x.Value) 
    End Sub 
+0

Вы можете установить .NET 4.6 на Windows 7, есть ли у вас какие-либо ограничения, поэтому вы должны использовать объединенную инфраструктуру? –

+0

Нет учетной записи администратора для установки для меня ... – Happypig375

+0

* «Я использую .NET 3.5 для обеспечения совместимости с Win7» * - вы знаете, что вы можете установить .NET Framework 4.0 на что-нибудь обратно в Windows XP, ты? https://msdn.microsoft.com/en-us/library/8z6watww(v=vs.100).aspx –

ответ

2

Если я понял ваш вопрос, вы хотели бы, чтобы инициализировать пользовательский словарь со следующим синтаксисом:

Public Value As New ReadOnlyDictionary(Of String, String) From {{"variable", "default value"},{"integer","123"}} 

Чтобы сделать это, если у вас есть VB 14,0, вы можете просто добавить метод Add к пользовательскому реализации:

Public Sub Add(key As TKey, value As TValue) 
    ' Implementation. 
End Sub 

Имейте в виду, что структура уже имеет IReadOnlyDictionary и ReadOnlyDictionary, так что вы, возможно, не потребуется для реализации обычным.

К сожалению, метод Add должен присутствовать, поэтому он будет меньше «ReadOnly», если вы не выполните некоторую проверку времени выполнения. «От» - это просто синтаксический сахар, поэтому он эквивалентен новизне словаря, добавляющего значения. Единственная альтернатива - передать значения конструктору.

+0

* Имейте в виду, что у рамки уже есть IReadOnlyDictionary и ReadOnlyDictionary, поэтому вам может не понадобиться реализовать пользовательский . * Добавлено описание того, почему я не использовал класс .NET. – Happypig375

+0

О, я также реализую 'AddRange()' также ... – Happypig375

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