11

Как из массива строк получить одну строку?

Было:

string[] many = { "ab", "bc", "cd", "de" };

Стало:

string one = "abbccdde";
stanislav
  • 34,518
  • 27
  • 98
  • 214

4 Answers4

16

Метод String.Join сцепляет элементы указанного массива или элементы коллекции, помещая между ними заданный разделитель.

string one = string.Join(null, many);
stanislav
  • 34,518
  • 27
  • 98
  • 214
11

Для этого существует специальный метод String.Concat

string[] many = { "ab", "bc", "cd", "de" };
string one = string.Concat(many);

Некоторые перегрузки метода Concat используют внутри себя StringBuilder, например метод принимающий IEnumerable<T> values. Другие перегрузки используют внутри себя небезопасный код, например метод принимающий params String[] values. Все это должно давать хорошую производительность при конкатенации строк.

ApInvent
  • 3,809
5

Еще можно используя StringBuilder.Append, к примеру:

string[] many = { "ab", "bc", "cd", "de" };
StringBuilder sb = new StringBuilder();
many.ForEach(x => sb.Append(x));
Console.WriteLine(string.Format("Result: " + sb)); // Result: abbccdde

Доступные методы слияния строк:

  1. Сложение строк с использованием символа (+)
  2. StringBuilder
  3. string.Join
  4. string.Concat
  5. string.Format

Ответ можно дополнить дополнительными способами, если таковые имеются.

Denis Bubnov
  • 13,958
  • а как в данном случае помогает string.Format? применительно к массиву – Grundy Aug 09 '16 at 07:17
  • @Grundy, string.Format - преобразует значения объектов в строки на основе указанных форматов и вставляет их в другую строку. Соответственно его можно использовать либо в методе, который преобразует массив в строку, перебирая элементы, либо в Lambda-запросе. Я привел доступные в моем понимании методы слияния строк, даже типичное преобразование. Результатом будет строка – Denis Bubnov Aug 09 '16 at 07:21
  • все равно не понятно как String.Format можно использовать для слияния строк в массиве – Grundy Aug 09 '16 at 07:52
  • @Grundy, вот пример: string resultPlus = string.Empty; many.ForEach(x => resultPlus = string.Format("{0}{1}", resultPlus, x) ); – Denis Bubnov Aug 09 '16 at 07:55
  • ох,ох,ох....... – Grundy Aug 09 '16 at 07:57
  • @Grundy, да, я понимаю, что способ не самый лучший, но все же - тоже способ. Так сказать особый случай "жесткого" кода. – Denis Bubnov Aug 09 '16 at 07:58
  • А зачем many.ForEach(x => sb.Append(x));? Чем это лучше foreach (var x in many) sb.Append(x);? – VladD Aug 09 '16 at 09:03
  • @VladD, запись в одну строку, а не в две – Denis Bubnov Aug 09 '16 at 09:05
  • @DenisBubnov: (1) А что мешает записать в одну строку? (2) А чем две строки хуже? Количество символов примерно то же самое, а конструкция проще, понятнее и эффективнее (нету косвенного вызова через лямбду). – VladD Aug 09 '16 at 09:07
  • @VladD, я привык пользоваться лямбдами. На мой взгляд такой код получается минимальным и содержательным. Собственно говоря - код понятен. Сколько программистов - столько мнений. Есть множество вариантов написания кода, выполняющего одну задачу. – Denis Bubnov Aug 09 '16 at 09:09
  • @DenisBubnov: Я тоже привык пользоваться лямбдами. Но по моему мнению, в данном контексте лямбда не нужна, раз можно обойтись нативной конструкцией. Лямбды нужны, чтобы сделать код проще, а не чтобы сделать его использующим лямбды. – VladD Aug 09 '16 at 09:21
  • @DenisBubnov: Может быть, мнение Эрика Липперта вас убедит: https://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/ – VladD Aug 09 '16 at 09:32
  • @VladD, да, убедили. По поводу проще, а не использующим лямбды. Просто для меня показалось проще, когда кода меньше. Да, Эрик затронул отладку - труднее отлаживать. Но я объяснил свое видение. Спасибо за интересную статью. – Denis Bubnov Aug 09 '16 at 09:51
2

Самый банальный наверно способ:

string[] many = { "ab", "bc", "cd", "de" };
string one = "";

for (int i = 0; i < many.Length; i++)
{
    one += many[i];
}
  • 1
    При этом последовательно создаются строки ab, abbc, abbccd, abbccdde. Далеко не самый оптимальный способ. – Nick Volynkin Aug 09 '16 at 06:31
  • 1
    @NickVolynkin, вообще говоря исключения не будет, но да, множественное создание строк при их большом количестве может стать проблемой – Grundy Aug 09 '16 at 06:44
  • 1
    -1: Майкрософт специально предостерегает от этого способа, так как он квадратичен по количеству копирований и создаёт много временных строк. Если уж непременно хотите вручную, нужно использовать StringBuilder. – VladD Aug 09 '16 at 07:06
  • 1
    @VladD, тут уже был ручной StringBuilder, но его почему-то тоже заминусовали :-) – Grundy Aug 09 '16 at 07:08
  • 1
    @Grundy: Ручной StringBuilder — это просто практически бесполезный код, раз в библиотеке есть лучшая функция. Но он хоть эффективен. Не стоит плюса, как рекомендующий неоптимальный подход, но не стоит на мой взгляд и минуса. – VladD Aug 09 '16 at 07:22
  • @VladD, а что может быть оптимальнее цикла со StringBuilder, библиотечные же функции его же и используют – Grundy Aug 09 '16 at 07:24