Преобразование List <int> в строку через запятую

92

Есть ли способ взять список и преобразовать его в строку, разделенную запятой?

Я знаю, что могу просто зациклировать и построить его, но почему-то я думаю, что некоторые из вас, ребята, более классный способ сделать это?

Я действительно хочу изучить эти типы "трюков", поэтому, пожалуйста, объясните или поделитесь с документами о методе, который вы используете.

Теги:
collections

8 ответов

166
Лучший ответ
List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())
  • 5
    Умный, но медленный и раздутый, поскольку он выделяет одну строку на элемент. Использование StringBuilder было бы гораздо более эффективным.
  • 3
    Из того, что я видел онлайн (быстрый поиск), String.Join работает быстрее, чем использование StringBuilder.
Показать ещё 15 комментариев
76

Простым решением является

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)

Я использовал его только сейчас в своем коде, работая funtastic.

  • 0
    Поблагодарить! это красивый подход
8
List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(String.Join(",", list.Select(i => i.ToString()).ToArray()));
  • 0
    Отлично, если вы не можете использовать .NET 4
6

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

http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx

и комментарий StackOverflow:

Задача Эрика Липперта "запятая" , лучший ответ?

  • 0
    Спасибо за ссылку. Эта проблема конкатенации строк оказалась более сложной и более образовательной, чем я ожидал!
3

Для дополнительной прохлады я бы сделал это методом расширения в IEnumerable <T> , чтобы он работал на любом IEnumerable:

public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim) {
    return string.Join(",", self)        
  }
}

Используйте его следующим образом:

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));
  • 0
    Две возможные оптимизации: 1) Добавить разделитель после каждого элемента независимо, затем удалить дополнительный после завершения цикла. 2) Укажите емкость для StringBuilder.
  • 1
    Если вы откроете Reflector, то получится, что Join суммирует длины для предварительного расчета размера буфера, а также «заправляет насос», добавляя первую строку вне цикла, а затем, внутри цикла, безоговорочно добавляя разделитель перед следующая строка В сочетании с некоторыми небезопасными / внутренними уловками, это должно быть очень быстро.
Показать ещё 2 комментария
1

Кажется разумным быстро.

IList<int> listItem = Enumerable.Range(0, 100000).ToList();
var result = listItem.Aggregate<int, StringBuilder, string>(new StringBuilder(), (strBuild, intVal) => { strBuild.Append(intVal); strBuild.Append(","); return strBuild; }, (strBuild) => strBuild.ToString(0, strBuild.Length - 1));
1

Моя "умная" запись:

        List<int> list = new List<int> { 1, 2, 3 };
        StringBuilder sb = new StringBuilder();
        var y = list.Skip(1).Aggregate(sb.Append(x.ToString()),
                    (sb1, x) =>  sb1.AppendFormat(",{0}",x));

        // A lot of mess to remove initial comma
        Console.WriteLine(y.ToString().Substring(1,y.Length - 1));

Просто не понял, как условно добавить запятую.

  • 1
    Пожалуйста, не пишите Select с побочными эффектами в лямбде. В этом случае вы даже не используете y , так что ваш Select по сути является просто foreach - поэтому запишите его как таковой.
  • 0
    Я не предлагал это как хорошее решение. ОП хотел что-то более интересное, чем foreach.
Показать ещё 2 комментария
0

вы можете использовать библиотеку System.Linq; Это более эффективно:

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));

Ещё вопросы

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