CDRxxx Ответов: 3

Vb: как объявить около 1000 stringbuilders по коду


Это мой код, который не работает, но он демонстрирует, что мне нужно делать:
создайте около 1000 stringbuilders, имя которых определяется строкой из двух символов (имена определяются записями в файле "C:\Temp\NGDDIVlist.txt").

Record = Split(File.ReadAllText("C:\Temp\NGDDIVlist.txt"), vbCrLf)
'Record holds the names for the stringbuilders
        For i = 0 To Record.length-1
            Dim Record(i) As StringBuilder
        Next


Невозможно объявить переменную, где имя этой переменной является "строкой"... Как я могу преодолеть эту проблему?

Дополнительные пояснения:
Ну, вопрос действительно в том, что:
On a daily basis a textfile is generated with about a million strings (C:\Temp\NGDDIVlist.txt). Each string is in fact a record with two fields. The project needs to search this textfile for matches on field 0 of each record and has to do that for more or less 400.000 times. For the time being this is done using Instr, but I am looking for faster ways to do this. If I can split up the initial textfile in less longer subfiles, the Instr will take less time. Therefore these subfiles need to be named with the 'key' used for splitting. For this key I want to use the last two characters of field 0 of each record in the initial textfile. To build those subfiles fast, I want to use stringbuilders and since the 'key' = 2 characters, there are 36 x 36 = cases...

Что я уже пробовал:

смотрите код
поискал в интернете решения, но не нашел ни одного

Maciej Los

Почему вам нужно создать более 1000 stringbuilders? Это звучит очень странно...

MadMyche

Это просто VB (как в VB6) или это VB.Net-что?

3 Ответов

Рейтинг:
24

OriginalGriff

Запись уже определена: это массив строк, потому что именно это возвращает Split.
Вы можете создать массив StringBuilder под другим именем:

Dim builders As StringBuilder() = New StringBuilder(Record.Length - 1) {}

For i As Integer = 0 To Records.Length - 1
    builders(i) = New StringBuilder(Records(i))
Next
Но... если вы не предлагаете изменить их, это бессмысленно и отнимает много памяти!

Вы не можете определить переменные во время выполнения, используя строку в качестве имени: вы можете использовать словарь, чтобы сделать что-то подобное:
    Dim builders As Dictionary(Of String, StringBuilder) = New Dictionary(Of String, StringBuilder)()

    For i As Integer = 0 To Records.Length - 1
        builders(Record(i)) = New StringBuilder()
    Next
End Sub
И получить доступ к каждому StringBuilder отдельно через builders
builders("AB").Append("Some text")
Console.WriteLine(builders("XY").ToString())
Но, честно говоря, я думаю, что вы слишком много думаете об этом, и было бы лучше сделать шаг назад и спросить себя, что вы делаете, что вы думаете, что это хорошая идея. Мне это не кажется хорошим решением какой-либо реальной проблемы, а затем обычно означает, что ранее при разработке проекта были приняты некоторые фундаментальные неправильные решения.


CDRxxx

Ну, вопрос действительно в том, что:
On a daily basis a textfile is generated with about a million strings (C:\Temp\NGDDIVlist.txt). Each string is in fact a record with two fields. The project needs to search this textfile for matches on field 0 of each record and has to do that for more or less 400.000 times. For the time being this is done using Instr, but I am looking for faster ways to do this. If I can split up the initial textfile in less longer subfiles, the Instr will take less time. Therefore these subfiles need to be named with the 'key' used for splitting. For this key I want to use the last two characters of field 0 of each record in the initial textfile. To build those subfiles fast, I want to use stringbuilders and since the 'key' = 2 characters, there are 36 x 36 = cases...

OriginalGriff

Во-первых, расщепление не будет быстрее: есть некоторая серьезная работа, проделанная за кулисами, чтобы выделить строку в куче для каждой отдельной строки и / или "ключа".
Вы можете посмотреть здесь:
https://www.codeproject.com/Tips/312312/Counting-Lines-in-a-String
Это показывает разницу между несколькими способами простого подсчета строк - что удивительно близко к тому, что вы делаете, когда думаете об этом.
Split очень, очень медленнее, чем решение, основанное на индексе чисто из-за накладных расходов на построение памяти.

Patrice T

Привет ОГ, взгляни на S3, это сообщение для нас.

Рейтинг:
16

Patrice T

Цитата:
Vb: как объявить около 1000 stringbuilders по коду

Вы пробуете вещи, чтобы получить рабочее решение, это хорошее состояние ума, но в вашем случае ваше "решение" пахнет неправильным подходом к вашей проблеме.

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

С помощью Инстр очень простодушен, но не эффективен на длинных строках, разбиение файла на 1200 частей улучшит время выполнения, но каждая часть все еще о 1000 записей и Инстр может совпадать во втором поле, с которым вам предстоит справиться.
С помощью словаря или базы данных (с индексом) поиск по полному файлу выполняется примерно за 20 записей и только по первому полю.
20 происходит из-за того, что и словарь, и база данных используют упорядоченный список записей, а поиск выполняется с помощью дихотомия, 1000000 записей-это примерно 2^20, так что 20 ключей для проверки поиска.

Словарь VBA - использование словаря VBA. Пары ключевых значений[^]

Совет: узнайте о доступных структурах и объектах, это может только помочь вам выбрать мудрый.


Рейтинг:
1

CDRxxx

Спасибо компании "OriginalGriff" и "Patrice T".
Оба ответа очень полезны!

В то время я действительно адаптировал эту процедуру, разделив файл "для проверки" на 1296 (36x36) подфайлов. Разделение занимает 10 секунд, но поиск позже непосредственно в нужном подфайле значительно ускоряет общий процесс!

С другой стороны, мне нужно изучить способы обработки текстовых файлов VB в виде индексированных файлов БД... Сейчас я заглядываю в словарь ...


Maciej Los

Это не ответ. Пожалуйста, удалите его, чтобы избежать голосования вниз. Такой контент должен быть размещен в качестве комментария к решению.

Patrice T

Привет,
Чтобы обсудить с автором решение, используйте кнопку "Задать вопрос или комментарий" в нижней части решения;
Преимущество, автор получает уведомление.
Чтобы ответить на комментарий, используйте кнопку "ответить" справа от имени автора.
Совет: избегайте использования решения для чего-либо еще, кроме решения.