Как я могу конвертировать {{"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
Вы можете установить .NET 4.6 на Windows 7, есть ли у вас какие-либо ограничения, поэтому вы должны использовать объединенную инфраструктуру? –
Нет учетной записи администратора для установки для меня ... – Happypig375
* «Я использую .NET 3.5 для обеспечения совместимости с Win7» * - вы знаете, что вы можете установить .NET Framework 4.0 на что-нибудь обратно в Windows XP, ты? https://msdn.microsoft.com/en-us/library/8z6watww(v=vs.100).aspx –