C # List <string> в строку с разделителем

632

Есть ли в C # функция для быстрого преобразования некоторой коллекции в строку и разделения значений с помощью разделителя?

Например:

List<string> names -> string names_together = "John, Anna, Monica"

бабушка
источник

Ответы:

1202

Вы можете использовать String.Join. Если у вас есть, List<string>то вы можете позвонить ToArrayсначала:

List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());

В .NET 4 вам больше не нужно ToArray, так как есть перегрузка, String.Joinкоторая требует IEnumerable<string>.

Результаты:


Джон, Анна, Моника

Quartermeister
источник
95

Вы также можете сделать это с linq, если хотите

var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);

Хотя я предпочитаю синтаксис non-linq в ответе Quartermeister и думаю, что он Aggregateможет работать медленнее (возможно, больше операций конкатенации строк).

боб
источник
19
Спасибо за быстрые ответы, оба работают отлично. Вы правы, я провел небольшое измерение производительности с использованием класса Stopwatch, а linq-way намного медленнее: String.Join (",", names.ToArray ()); -> взял 18 тиков Агрегат ((a, b) => a + "," + b) -> взял 736 тиков
нан
2
Да, я думаю, что Aggregateлучше для операций типа Math. В случае со строками эта операция аналогична for eachвставке и добавлению строки, которая очень медленно работает неэффективно, поскольку вы создаете новую строку для каждого элемента, который существует в списке.
Боб
Обратите внимание, что Aggregate без начального значения вызовет исключение InvalidOperationException, если контейнер пуст. Используйте заполненную версию Aggregate (seed, func), чтобы избежать обработки ошибок кодом или условных проверок. String.Join не выбрасывает пустое значение, поэтому нет необходимости в начальном или дополнительном коде ... плюс для него не требуется Linq, а синтаксис немного понятнее.
Уаканана
1
Агрегирование в приведенном выше примере может работать быстрее, если вы будете использовать StringBuilder. Использование «+» для выполнения множественной конкатенации не рекомендуется. См. Раздел «Замечания» здесь ( msdn.microsoft.com/en-us/library/… )
Илья Денисов