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

386

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

Например:

List<string> namesstring names_together = "John, Anna, Monica"

Теги:
string
list
delimiter

3 ответа

736
Лучший ответ

Вы можете использовать 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>.

64

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

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

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

  • 13
    Спасибо за быстрые ответы, оба работают отлично. Вы правы, я провел небольшое измерение производительности с использованием класса Stopwatch, а linq-way намного медленнее: String.Join (",", names.ToArray ()); -> взял 18 тиков Агрегат ((a, b) => a + "," + b) -> взял 736 тиков
  • 1
    Да, я думаю, что Aggregate лучше подходит для операций типа Math. Со строками эта операция аналогична for each операции и просто добавляется к строке, что очень медленно и неэффективно, потому что вы создаете новую строку для каждого элемента, который существует в списке.
Показать ещё 2 комментария
-6
List<string> targets = new List<string>();

var InboxChecked = true;
var BannerChecked = false;
var EmailChecked = true;

if (InboxChecked)
{
    targets.Add("Inbox");
}

if (BannerChecked)
{
    targets.Add("Banner");
}

if (EmailChecked)
{
    targets.Add("Email");
}

var index = 0;

if (targets.Any())
{
    var aggregate = targets.Aggregate((s1, s2) =>
    {
        return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2;
    });

    // aggregate.Dump();
}

// returns -> Inbox and Email
  • 0
    Не могли бы вы объяснить, почему вы сравниваете индекс ++ с target.Count ()?
  • 4
    Это очень сложно для такой простой задачи
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню