Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
1

List<string> или все же List<StringBuilder>, что лучше использовать?

04.09.2019, 12:26. Показов 4789. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, хочется узнать с точки зрения производительности что подходит лучше в данном случае.

Есть List<List<T>>, в него добавляются строковые значения.
Создается некое подобие ступенчатого массива, но динамически.
К примеру:
List<List<T>> где T пока string
|
0. -List<T> {"1","2","3"}
|
1. -List<T> {"4","5"}
|
2. -List<T> {"6","7","8","9","10"}

После чего мне нужно пройтись по первому листу и объединить значения 0 листа с значениями листа 1, далее полученное значение обьединить с List 2 и тд.. так же я заменяю значения List 1 на полученные, для удобства соединения с List 2.


List<List<T>> где T пока string
|
0. -List<T> {"1","2","3"} // наверное стоит удалять больше не используемый лист, но вроде как тогда индексы смещаются у всех значений, а это накладывает расходы на память(в теории, не уверен на сколько сильно)
|
1. -List<T> {"14","25","3"}
|
2. -List<T> {"6","7","8","9","10"}

1. Стоит ли заменить List<string> на List<StringBuilder> ?
2. Что вообще использовать в данной задаче вместо List<List<T>> ? может стоит заменить на какой нибудь ступенчатый массив?
3. На сколько вообще затратнее использовать замену в List 1, или лучше просто использовать буферную переменную?

Цель сделать данный алгоритм максимально менее затратным по ресурсам памяти.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2019, 12:26
Ответы с готовыми решениями:

Что предпочтительней в плане быстродействия и работы с памятью: List<List<string>> - new или .Clear()
что предпочтительней в плане быстродействия и работы с памятью создать в цикле new...

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например,...

Разбить List<string> на несколько обьектов c List<string>
Задумался как я то кусочками все делить оказалось не так уж просто :scratch: List&lt;string&gt;...

Необходимо создать dll в которой буду обрабатывать list<list<string>>
Необходимо создать dll в которой буду обрабатывать list&lt;list&lt;string&gt;&gt; как объявить методы класса...

14
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
04.09.2019, 12:42 2
Alone11, похоже на формирование какой-то двухмерной структуры с последующей проекцией-суммированием колонок в одномерный массив.

Может проще будет завести List<string>? Количество элементов - количество колонок. При добавлении новых "строки" вы можете сразу выполнять конкатенацию и замену старых строк-значений новыми.

List<T> {"1","2","3"}

+ {"4","5"}

List<T> {"14","25","3"}

+ {"6","7","8","9","10"}

List<T> {"146","257","38","9","10"}

Никаких промежуточных списков и StringBuilder'ов.

Добавлено через 1 минуту
Ну и вопрос на засыпку: в строках только числа?
0
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
04.09.2019, 12:42 3
а что там вообще происходит? Задача в общем какая?
Вроде как список чисел целых, но почему то список строк.
0
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
04.09.2019, 13:04  [ТС] 4
Usaga, Да, только числа. Возможно, да , лучше List<string>, но тут скорее , нужно исходить из описания задачи, там при больших числах очень большой перебор и много конкатенаций, по этому скорее всего нужно как буфер использовать StringBuilder, и уже с ним операции проворачивать,а вместо List<> вообще словарь использовать, но я пока в раздумье.

QuestionAnd, Задача такая,
есть некая последовательность цифр, произвольного значения и длинны.
К примеру "123".
За каждой цифрой закреплены возможные варианты, то есть если представить каждую цифру как ключ - значение, то
у 1 может быть значение 1,8,9.

Задача вывести список всех возможных комбинаций из всех цифр в строковом формате.
Пример 123, 823, 923.

Я распарсил значения по List<string> (использовал строки, а не числа так как не хочется с разрядами морочиться)
получился некое подобие словаря, а потом иду перебором по парно, и обьединяю сначала первые два списка в единую пару, потом прохожусь по их вариантам и обьединяю с соседним List

изначальная последовательность: 123
у 1 могут быть {1,8,9}
у 2 для удобства только {2}
у 3 для удобства только {3}

List<List<string>>
|
--List<string> {1,8,9}
|
--List<string> {2}
|
--List<> {3}

Я теперь соединяю их проходясь сначала по первому Листу и рядом стоящему, потом полученные значения соединяю со следующим листом. Получается в итоге 123, 823, 923.

Цель сделать данный алгоритм максимально менее затратным по ресурсам памяти.
0
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,595
04.09.2019, 13:07 5
Цитата Сообщение от Alone11 Посмотреть сообщение
Да, только числа.
Тогда с числами и надо работать. И не будет никакого оверхеда на конкатенации и всякие StringBuilder'ы.
2
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
04.09.2019, 15:32 6
Цитата Сообщение от Alone11 Посмотреть сообщение
Задача такая,
Насколько я понял.
Для каждой позиции задаются варианты значений.
На выходе надо получить все возможные варианты общей комбинации?

Если так здесь было несколько тем с хорошими решениями. Надо поискать.
Может у меня в архивах что есть - посмотрю.
0
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
04.09.2019, 15:35 7
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Насколько я понял.
а мне вот до сих пор непонятно
числа или цифры
Цитата Сообщение от Alone11 Посмотреть сообщение
Usaga, Да, только числа.
Цитата Сообщение от Alone11 Посмотреть сообщение
QuestionAnd, Задача такая,
есть некая последовательность цифр,
алгоритм примерно понятен ,

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
            string s = "123";
            var dict = new Dictionary<char, List<char>>
            {
                { '1', new List<char>{ '1', '8', '9' }
                },
                 { '2', new List<char>{ '2' }
                },
                  { '3', new List<char>{ '3' }
                }
            };
 
 
 
            for (int i = 0; i < s.Length; i++)
            {
                List<char> value;
                if (dict.TryGetValue(s[i], out value))
                {
                    for (int j = 0; j < value.Count; j++)
                    {
 
                        for (int k = 0; k < s.Length; k++)
                        {
                            if (k == i) Console.Write(value[j]);
                              else   Console.Write(s[k]);
                        }
                        Console.WriteLine();
                    }
                     Console.WriteLine();
                }
            }
123
823
923

123

123
но задачу нужно полнее описать. что от куда приходит и куда уходит и в каком конечном виде
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
04.09.2019, 20:33 8
Цитата Сообщение от Alone11 Посмотреть сообщение
хочется узнать с точки зрения производительности что подходит лучше в данном случае.
Цитата Сообщение от QuestionAnd Посмотреть сообщение
а мне вот до сих пор непонятно
числа или цифры
А разница какая?
Делал когда-то обобщённые методы. Принимают любые типы.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    /// <summary>Класс с методами расширение для IEnumerable</summary>
    public static class IEnumerableExtension
    {
 
        /// <summary>Возвращает комбинации элементов</summary>
        /// <typeparam name="T">Тип элемента</typeparam>
        /// <param name="listSymbols">Список вариантов элементов для каждой позиции</param>
        /// <returns>Возвращает все возможный комбинации элементов для заданных вариантов значений в каждой позиции</returns>
        static public IEnumerable<IEnumerable<T>> GetCombinations<T>(this IEnumerable<IEnumerable<T>> listSymbols)
        {
            if (listSymbols == null)
                yield break;
 
            if (!listSymbols.Any())
            {
                yield return Enumerable.Empty<T>();
                yield break;
            }
 
            foreach (T item in listSymbols.First())
                foreach (IEnumerable<T> combination in listSymbols.Skip(1).GetCombinations())
                    yield return combination.Prepend(item);
 
        }
 
        static public string ToPrint<T>(this IEnumerable<IEnumerable<T>> listList, string separatorRow = "\r\n", string separatorItem = ", ")
        {
            StringBuilder ret = new StringBuilder();
            bool firstRow = true;
            foreach (IEnumerable<T> list in listList)
            {
                if (firstRow)
                    firstRow = false;
                else
                    ret.Append(separatorRow);
 
                bool firstItem = true;
                foreach (T item in list)
                {
                    if (firstItem)
                        firstItem = false;
                    else
                        ret.Append(separatorItem);
                    ret.Append(item);
                }
            }
            return ret.ToString();
        }
 
    }
Использование
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int[][] numberVariations = new int[][]
    {
        new int[]  {1,8,9 },
        new int[]  {2},
        new int[]  {3}
    };
    Console.WriteLine("Вывод { {1, 8, 9}, {2}, {3} }");
    Console.WriteLine(numberVariations.GetCombinations().ToPrint());
 
    numberVariations = new int[][]
    {
        new int[]  {1,2,3 },
        new int[]  {4,5},
        new int[]  {6,7,8,9,10}
    };
    Console.WriteLine();
    Console.WriteLine("Вывод { {1, 2, 3}, {4, 5}, {6, 7, 8, 9, 10} }");
    Console.WriteLine(numberVariations.GetCombinations().ToPrint());
КонсольВывод { {1, 8, 9}, {2}, {3} }
1, 2, 3
8, 2, 3
9, 2, 3

Вывод { {1, 2, 3}, {4, 5}, {6, 7, 8, 9, 10} }
1, 4, 6
1, 4, 7
1, 4, 8
1, 4, 9
1, 4, 10
1, 5, 6
1, 5, 7
1, 5, 8
1, 5, 9
1, 5, 10
2, 4, 6
2, 4, 7
2, 4, 8
2, 4, 9
2, 4, 10
2, 5, 6
2, 5, 7
2, 5, 8
2, 5, 9
2, 5, 10
3, 4, 6
3, 4, 7
3, 4, 8
3, 4, 9
3, 4, 10
3, 5, 6
3, 5, 7
3, 5, 8
3, 5, 9
3, 5, 10
0
60 / 45 / 17
Регистрация: 12.08.2019
Сообщений: 161
04.09.2019, 22:03 9
Цитата Сообщение от Элд Хасп Посмотреть сообщение
числа или цифры
А разница какая?
Ну как какая.. 0,1, 2, 3 ... 9 -- это цифры

А 10 это число.
Цитата Сообщение от Alone11 Посмотреть сообщение
0. -List<T> {"1","2","3"}
|
1. -List<T> {"4","5"}
|
2. -List<T> {"6","7","8","9","10"}
Мне то разницы нет особой. Ну наверное стоило уточнить ...


Цитата Сообщение от Элд Хасп Посмотреть сообщение
Возвращает все возможный комбинации элементов для заданных вариантов
Элд Хасп,
это конечно хорошо сделано, но там задачка другая
Цитата Сообщение от Alone11 Посмотреть сообщение
За каждой цифрой закреплены возможные варианты, то есть если представить каждую цифру как ключ - значение, то
у 1 может быть значение 1,8,9.
Задача вывести список всех возможных комбинаций из всех цифр в строковом формате.
Пример 123, 823, 923.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
04.09.2019, 22:10 10
Цитата Сообщение от Элд Хасп Посмотреть сообщение
if (firstRow)
* * * * * * * * * * firstRow = false;
может string.Join все таки? а то больно смотреть
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
04.09.2019, 22:13 11
Цитата Сообщение от QuestionAnd Посмотреть сообщение
то конечно хорошо сделано, но там задачка другая
Именно та которую я сделал. Посмотрите в выводе консоль верхние строчки - показана работа именно на этом исходном наборе.

Добавлено через 2 минуты
Цитата Сообщение от КОП Посмотреть сообщение
может string.Join все таки? а то больно смотреть
Я не знал как лучше сделать.
string.Join нагляднее, удобнее.
Но я опасаюсь, что будет слишком много мусора создавать.
Поэтому использовал StringBuilder.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
04.09.2019, 22:16 12
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но я опасаюсь, что будет слишком много мусора создавать.
Поэтому использовал StringBuilder.
там под капотом он и есть, даже вон пул билдеров
https://referencesource.micros... /string.cs
C#
1
StringBuilder result = StringBuilderCache.Acquire();
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
04.09.2019, 22:22 13
Цитата Сообщение от КОП Посмотреть сообщение
там под капотом он и есть, даже вон пул билдеров
Это я знаю.
Но там же получается двойная вложенность.
Сначала будет создан для каждой строки по одному string, потом из них будет собран результирующий.
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
04.09.2019, 22:49 14
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сначала будет создан для каждой строки по одному string, потом из них будет собран результирующий.
а, я проглядел что там сразу и строки разные собираются, тогда да.
0
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
15.09.2019, 13:13  [ТС] 15
Так, я сделал, O(1), вроде как. Чуть позже пришлю код. Всем спасибо за помощь но по факту требовалось немного не то.
0
15.09.2019, 13:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2019, 13:13
Помогаю со студенческими работами здесь

Записать в файл по очереди элементы List<string> и List<char>
У меня есть List с string элементами и есть List с char элементами. Как сделать чтобы у файл...

Сортировка двумерного List<List<string>>, по 1-ой строке, чтобы элементы 2-ой строки передвинулись в соответствии с 1-ой
Дан двумерный массив List&lt;List&lt;string&gt;&gt; , состоящий из двух строк, как его отсортировать по первой...

Разбить строки на символы и поместить их в List<List<string>>
Есть несколько строк, например, word1 word2 word3 но их может быть больше. Нужно разбить и их...

Как передать list<string> в поток и как такой же list<string> вывести из потока?
Как передать list&lt;string&gt; в поток и как такой же list&lt;string&gt; вывести из потока в richtextbox?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru