Объединить диапазон списка <string> - PullRequest
0 голосов
/ 31 января 2020

Если у меня есть List<string>, и я хочу создать один string из всех элементов в списке, я могу использовать Join или Aggregate, как показано ниже для достижения sh that.

var list = new List<string>() { "A", "B", "C", "D", "E" };
var concatAllByJoin = string.Join(string.Empty, list);
var concatAllByAggregate = list.Aggregate((a, b) => a + b);

Любой из них выдаст строку ABCDE.

Что делать, если я хочу сделать то же самое, но только для определенного диапазона в списке. Скажем, я хочу объединить позиции между индексами 1 и 3 включительно. Другими словами, я хочу, чтобы результат был BCD.

Один из подходов, который я могу придумать, заключается в использовании GetRange() примерно так:

var concatRange = string.Join(string.Empty, list.GetRange(1, 3));

Это, очевидно, работает, но проблема это дублирование данных. Мне интересно знать, есть ли способ сделать это без дублирования.

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Если вы сделаете это:

var concatRange = string.Join(string.Empty, list.Skip(1).Take(3));

, вы не создадите другой экземпляр списка. Но для небольших наборов, я думаю, вы найдете дополнительный список не таким дорогостоящим и, вероятно, гораздо более эффективным, чем перечислители. Помните, что элементы списка хранят только ссылки , поэтому сами строковые значения не копируются ни с одним из параметров.

1 голос
/ 31 января 2020

Вы можете использовать StringBuilder для этого

var list = new List<string>() { "A", "B", "C", "D", "E" };

var builder = new StringBuilder();
for (int i = 1; i <= 3; i++)
{
    builder.Append(list[i]);
}

var concatRange = builder.ToString();

Он не создает никаких копий списка источников - вы просто получаете доступ к элементам по индексу и добавляете их в StringBuilder. Вы также можете указать максимальное количество элементов (которое может быть сохранено в памяти, выделенной экземпляром StringBuilder), указав значение capacity, переданное в конструктор.

Тест производительности по сравнению с Linq решение. Я не думаю, что они очень точные, потому что список источников слишком мал, но разница в производительности значительна.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...