powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с многомерными массивами строк (VB.Net)
14 сообщений из 14, страница 1 из 1
Работа с многомерными массивами строк (VB.Net)
    #39110281
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С массивами особо не работал, и в VB6 тоже. С многомерными вообще не работал.
Поэтому сижу и малость туплю.

С одномерным как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
  Public mas_file1() As String = {
    "section1",
    "section2",
    "section3"
  }
    MsgBox(mas_file1(0))


Ну вроде работает, выводит "section".

С двумерным, порыв всякие поиски наваракал типа:
Код: vbnet
1.
2.
3.
4.
5.
6.
  Public mas_file1_section1() = {
    ({"param1", "value1"}),
    ({"param2", "value1"}),
    ({"param3", "value1"})
  }
    MsgBox(mas_file1_section1(0, 0))


Ну и еще до компиляции пишет "Число индексов больше числа измерений индексированного массива."
Как правильно записать и обращаться?

=====
Что я вообще хочу...
Для языковых настроек программы использую такую конструкцию, грубо:
1) набор из нескольких ini файлов
2) в каждом ini несколько секций
3) в каждой секции несколько параметров со значениями

Кухню эту с механизмами чтения из ini я в целом сделал.

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

Ну и насколько эта идея имеет право на жизнь.
(общий размер папки с реальными английскими ini сейчас = 211КБ), если грузить все это в прогу "массивами", то не рискую ли сожрать память, перегрузить прогу и т.п.
В принципе я могу "хранить карту" в "зарезервированной" папке с реальными ini и обращаться к ней при необходимости, но это "ненадежно" (некто взял и удалил файлы, или стер параметры, или исправил их значения и т.п.) , хотелось бы все же инкапсулировать в код.
Какие соображения?
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39110312
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, с двумерным вроде так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Public mas_file1_section1()() As String = {
    ({"param1", "value1"}),
    ({"param2", "value2"}),
    ({"param3", "value3"})
  }

    MsgBox(mas_file1_section1(2)(1))



А если хочу 3-х мерный?
Который бы описывал
Код: vbnet
1.
2.
3.
4.
5.
6.
section1
  param1=value1
  param2=value2
section2
  param1=value1
...
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39110372
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77Что я вообще хочу...
Для языковых настроек программы использую такую конструкцию, грубо:
1) набор из нескольких ini файлов
2) в каждом ini несколько секций
3) в каждой секции несколько параметров со значениями
Ну и сделайте несколько классов, а не занимайтесь ерундой с массивами и индексами
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39110547
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, я бы использовал Dictionary
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim smth As New Dictionary(Of String, Dictionary(Of String,String))
Dim en As New Dictionary(Of String, String) From { _
    {"param1", "value1"}, _
    {"param2", "value2"}, _
    {"param3", "value3"} _
}
smth.Add("english", en)
Dim ru As New Dictionary(Of String, String) From { _
    {"param1", "значение1"}, _
    {"param2", "значение2"}, _
    {"param3", "значение3"} _
}
smth.Add("russian", ru)
Dim param As String = smth("russian")("param2")
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39111340
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Cat2]Дмитрий77Ну и сделайте несколько классов, а не занимайтесь ерундой с массивами и индексами
Несколько классов или несколько функций - это значит несколько громоздских функций, в каждой из которых я по сути должен ручками прописать действие для каждого параметра в ini файле. А потом еще не забыть править каждого монстра при добавлении новых параметров.
Если я использую "карту-массив", вшитую в прогу, то я могу итти по ней по циклу
Код: vbnet
1.
2.
3.
    For Each m In mas_file1
      Debug.Print(m.GetValue(0) & ":" & m.GetValue(1) & "=" & m.GetValue(2))
    Next


Дописываю в коде если надо только элементы массива удобным образом, сами же функции не меняются.

Во втором посте у меня конечно не многомерный, а массив массивов, разобрался. Но в принципе оно устроит.

bazile, может ты не понял но у меня не по ini-файлу на каждый язык, а набор из этак 10 ini на каждый язык, примерно соответствует отдельным модулям (каждый набор в своей папке), не рискнул использовать один большой.
Словарь наверно не хочу, тем более там кажется только линейно параметр-значение

=============
Короче я хочу сделать так.
По одному массиву на каждый ini-файл, объявляю так, с инициализацией (массив 3-х мерных массивов по сути):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Public mas_file1()() As String = {
    ({"section1", "param11", "value21"}),
    ({"section1", "param12", "value22"}),
    ({"section1", "param12", "value22"}),
    ({"section2", "param21", "value21"}),
...
    ({"sectionN", "paramN1", "valueN1"}),
...
  }



Любая ф-ция которая будет с этим работать будет выглядеть примерно так:
Код: vbnet
1.
2.
3.
4.
5.
6.
    For Each m In mas_file1
      Debug.Print(m.GetValue(0) & ":" & m.GetValue(1) & "=" & m.GetValue(2))
      'например пишу реальный ini из своей "дефолтной карты"
      'или нормализую-проверяю имеющийся реальный ini на предмет корректности набора секция-параметры
      '(0)-секция, (1)-параметр (2)-его дефолтное EN-значение
    Next


Править эту конструкцию в коде если надо в этом виде очень легко (в одном месте).
Меня здесь как всегда беспокоит следующее.
Общий размер моих реальных ini как я упомянул около 200-250КБ.
Если я пишу эту конструкцию как public с инициализацией моего большого количества элементов,
то надо думать у меня программа при старте сожрет память под эти массивы, т.е. сравнимую с указанным объемом надо думать.
Это не много или таки спички? Счас глянул через диспетчер задач, у меня один .Net-модуль в среднем при старте жрет 10000 K -15000 K Наверно спички, но стоит ли так транжирить?
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39111615
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77,
Вообще-то лучше бы вы сразу начинали с бест-практик, а не изобретали свои треугольные велосипеды


https://msdn.microsoft.com/ru-ru/library/h6270d0z(v=vs.110).aspx
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39111726
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

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

Массивы-карту уже нарисовал. Пришлось написать маленькую вспомогательную утилиту, которая мне их нарисовала, за счет чего съекономил недели думаю 2.
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39111812
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77У меня механизм добавления произвольного языка, а не пара языков тупо зашитых в ресурсы (где этой парой все и ограничено).

Можно сказать, что это у Вас все тупо зашито в древние ини-файлы, которые уже 20 лет не используются в приличных программах.

Откуда Вы взяли, что "пару" ? В таблице культур что-то около 200 языков.

Вы придумали свой способ локализации, который Вам кажется остроумным и быстрым. Возможно он действительно прекрасен. Вот только локализация не ограничивается переводом строк. Как Вы будете решать проблемы с календарем, представлением дат и чисел? Направлением письма?

Конечно, для хелловорда все это не надо, но все же?
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39111843
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ах да. Критикуя предлагай.
Предлагаю использовать для хранения не ини-файлы, а один конфиг на XML, что бы использовать все плюшки от Linq to XML и от контрола PropertyGrid
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39111895
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77bazile, может ты не понял но у меня не по ini-файлу на каждый язык, а набор из этак 10 ini на каждый язык, примерно соответствует отдельным модулям (каждый набор в своей папке), не рискнул использовать один большой.
Это не имеет значения. Структуру словаря можно сделать любой. Единственное что я не учел это значение по умолчанию для параметра, но это легко решается заменой значения на пару значений в виде массива.

Дмитрий77Любая ф-ция которая будет с этим работать будет выглядеть примерно так:
Код: vbnet
1.
2.
3.
For Each m In mas_file1
    ' ....
Next


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

Дмитрий77 Это не много или таки спички?
Само по себе немного, но если есть возможность съэкономить то лучше ей воспользоваться. Например, загружать данные для локализации по мере открытия окон которым она нужна.
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39112766
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileЕсли ты собираешься циклом искать значение по имени, то тут хештаблица прямо таки просится т.к. она оптимизирована под быстрый поиск по ключу, которым в данном случае служит имя параметра.
Не, речь идет исключительно о линейных обслуживающих тупых процедурах.
Например код ниже пишет целиком ini-файл из дефолтного массива-карты (массив трехмерных массивов секция-имя_параметра-значение):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  Private Sub CreateLanguageIniFromArray(ByVal path_to As String, ByVal ini_name As String, ByRef ini_mas()() As String)
    Dim path_ini As String = IO.Path.Combine(path_to, ini_name)
    Dim section As String = ""
    Dim param As String = ""
    Dim value As String = ""
    Using file As System.IO.StreamWriter = _
     New System.IO.StreamWriter(path_ini, False, System.Text.Encoding.Unicode) 'создается новый файл
      For Each item In ini_mas
        If item.GetValue(0) <> section Then
          section = item.GetValue(0)
          file.WriteLine("[" & section & "]")
        End If
        file.WriteLine(item.GetValue(1) & "=" & item.GetValue(2))
      Next
    End Using
  End Sub


Это(код выше) очень быстро работает, уже проверил. Кстати в данном случае гораздо быстрее чем если писать каждый параметр через ini-ф-ции (код ниже):
Код: vbnet
1.
2.
3.
    For Each item In ini_mas
      WritePrivateProfileString(item.GetValue(0), item.GetValue(1), item.GetValue(2), path_ini)
    Next



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

Или аналогично, отобразить пары параметр-значение в интерфейсе, где пользователь может править "язык" - в правильной удобочитаемой последовательности. Для этого и нужна упорядоченная "карта-массив"(словарь или массив думаю не принципиально), где в отличии от реального ini где последовательность секций и параметров внутри секции не играют роли, API ф-ции ведь пишут в ini хаотически (новую секцию в конец файла, новый параметр в конец секции) и сортировками не занимаются.

Ну а достать из ini конкретное значение конкретного параметра - на это есть стандартные ф-ции работы с ini - но об этом речь не идет.
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39112800
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77(массив трехмерных массивов секция-имя_параметра-значение)
Зачем трехмерный массив? В данном случае ключ это {секция, имя_параметра}.
Создать отдельный класс IniKey{String, String} и объекты этого класса использовать в качестве ключа.
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39112930
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДмитрий77(массив трехмерных массивов секция-имя_параметра-значение)
Зачем трехмерный массив?
Я неправильно "выразился". Массив, каждый элемент которого есть массив из 3-х элементов о чем писал выше.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Public mas_file1()() As String = {
    ({"section1", "param11", "value21"}),
    ({"section1", "param12", "value22"}),
    ({"section1", "param12", "value22"}),
    ({"section2", "param21", "value21"}),
...
    ({"sectionN", "paramN1", "valueN1"}),
...
  }
...
Рейтинг: 0 / 0
Работа с многомерными массивами строк (VB.Net)
    #39117025
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Дмитрий77]Ну, с двумерным вроде так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Public mas_file1_section1()() As String = {
    ({"param1", "value1"}),
    ({"param2", "value2"}),
    ({"param3", "value3"})
  }

    MsgBox(mas_file1_section1(2)(1))



это - не двумерный массив вообще. Это - массив массивов.

Все тут разжевано.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с многомерными массивами строк (VB.Net)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]