2015-02-05 3 views
0

Я создаю приложение Windows в VB.NET, в котором необходимо хранить приличную сумму ассоциативной информации о разных приложениях. Я пытаюсь выяснить, как лучше всего хранить эти данные.VB.net разнесенный массив разных типов

После выполнения некоторых исследований лучшим решением, которое я нашел, является использование массивов объектов или словарей объектов.

Вот моя структура данных, которая должна быть сохранена:

var Info[AppID]['AppName']-> String (returns the app name as String) 
       ['Exes'] -> Array of Strings 
       ['RegKeys'] -> Array of Strings 
       ['Versions'][VersionID]['PCID'] -> String 
             ['Date'] -> DateTime 
             ['Size'] -> Integer 

Ключи без кавычек являются динамическими и представляют фактическое AppID/VERSIONID, ключи в кавычках являются статическими (так 2-й ключ всегда будет иметь 'AppName' 'Exes' и т.д.

так, например:

Info[123ab]['Name'] = 'Internet Exploder' 
      ['Exes'] = {'iexplore.exe', 'whatever.exe'} 
      ['RegKeys'] = {'hkey/local machine .....'} 
      ['Versions'][1]['PCID'] = 'My Desktop' 
          ['Date'] = Jan 1 1960 
          ['Size'] = 9001 

будет объявлен и создан в качестве

Dim appinfo As New Dictionary(Of String, Object) 
    Dim Lv2 As New Dictionary(Of String, Object) 

    Dim Exes As New List(Of String)(New String() {"iexplorer.exe", "whatever.exe"}) 
    Dim RegKeys As New List(Of String)(New String() {"blah"}) 
    Dim Directories As New List(Of String)(New String() {"c:\program files\internet explorer"}) 
    Dim Name As String = "Internet Exploder" 
    Dim Versions As New Dictionary(Of String, Object) 
    Dim VersionsLv2 As New Dictionary(Of String, Object) 

    Dim VersionID As String = "1" 
    Dim PCID As String = "My Desktop" 
    Dim TheDate As Date = Now 
    Dim Size As Integer = 9001 

    VersionsLv2.Add("PCID", PCID) 
    VersionsLv2.Add("Date", TheDate) 
    VersionsLv2.Add("Size", Size) 

    Versions.Add("VersionID", VersionsLv2) 

    Lv2.Add("Name", Name) 
    Lv2.Add("RegKeys", RegKeys) 
    Lv2.Add("Directories", Directories) 
    Lv2.Add("Versions", Versions) 

    appinfo.Add("abc12", Lv2) 

Мне просто интересно, знает ли кто-нибудь лучший способ сделать это? Я ненавижу работать с вершины дерева, чтобы инициализировать переменную, но это, похоже, работает нормально.

Благодарим вас за ввод!

ответ

1

Похоже, вы должны определить два типа для начала, например.

Class App 

    Private ReadOnly _exes As New List(Of String) 
    Private ReadOnly _regKeys As New List(Of String) 
    Private ReadOnly _versions As New List(Of Version) 

    Public Property AppId() As String 
    Public Property AppName() As String 

    Public ReadOnly Property Exes() As List(Of String) 
     Get 
      Return _exes 
     End Get 
    End Property 

    Public ReadOnly Property RegKeys() As List(Of String) 
     Get 
      Return _regKeys 
     End Get 
    End Property 

    Public ReadOnly Property Versions() As List(Of Version) 
     Get 
      Return _versions 
     End Get 
    End Property 

End Class 

Class Version 

    Public Property VersionId() As String 
    Public Property PcId() As String 
    Public Property [Date]() As Date 
    Public Property Size() As Integer 

End Class 

В этом примере Version объекты хранятся в App объекта в простой коллекции и вы получите их по индексу и использовать LINQ, чтобы получить один за ID. Если вы хотите, вы можете сделать Versions недвижимость Dictionary. Затем вы можете создать массив, List или Dictionary, чтобы сохранить свои App объектов.

+0

Большое спасибо за ваш ответ. Это выглядит очень привлекательно. Я не потратил слишком много времени на vb.NET и увидел, что вы можете определить свой собственный тип с помощью классов, но не смогли полностью понять. Я вернусь к документации по этому вопросу, но с другой стороны - есть ли особая причина, почему только 3 списка находятся в «public App()», а не в других свойствах? Не хватает ли в массиве избыточности? Или я понимаю это неправильно? – TheOddPerson

+0

Необычно, чтобы свойство чтения/записи отображало массив. Затем можно заменить существующий массив снаружи новым. Обычно свойство только для чтения предоставляет коллекцию, поэтому элементы можно добавлять и удалять, но сама коллекция не может быть заменена. В самой Структуре есть много примеров, например. 'ListBox.Items' и многие другие. В моем коде выше конструктор 'App' используется для создания пустых коллекций при создании самого объекта' App'. Другим свойствам не нужна никакая инициализация, поэтому они не упоминаются в конструкторе. – jmcilhinney

+0

@tinstaafl, хороший пункт и сделано. Я не уверен, почему я это сделал в первую очередь. Новый код немного отличается по структуре из-за различного синтаксиса, но функционально эквивалентен. – jmcilhinney

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