Какой самый чистый способ создать список строковых значений через IList<string>
или через запятую IEnumerable<string>
?
String.Join(...)
работает string[]
так, что может быть неудобно работать, когда такие типы, как IList<string>
или IEnumerable<string>
не могут быть легко преобразованы в массив строк.
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
Ответы:
.NET 4+
Подробные и предварительные решения .Net 4.0
IEnumerable<string>
могут быть преобразованы в массив строк очень легко с помощью LINQ (.NET 3.5):Достаточно просто написать эквивалентный вспомогательный метод, если вам нужно:
Тогда назовите это так:
Вы можете позвонить
string.Join
. Конечно, вам не нужно использовать вспомогательный метод:Последний немного глоток, хотя :)
Вероятно, это будет самый простой способ сделать это, а также довольно производительный - есть и другие вопросы о том, на что точно похожа производительность, включая (но не ограничиваясь) этот .
Начиная с .NET 4.0, существует больше перегрузок
string.Join
, поэтому вы можете просто написать:Гораздо проще :)
источник
List<T>
нужно. Зачем изобретать велосипед?ToList
. Это нормально использовать,string myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))
хотя.К вашему сведению, версия .NET 4.0
string.Join()
имеет некоторые дополнительные перегрузки , с которыми можно работать,IEnumerable
а не только с массивами, включая тот, который может работать с любым типомT
:источник
str = emps.Select(e => e.SSN).Join(",")
Самый простой способ, который я вижу, это использовать
Aggregate
метод LINQ :источник
Func<StringBuilder,string,StringBuider>
. Затем просто вызовитеToString()
возвращенный StringBuilder. Это, конечно, не так красиво, хотя :)input.Count
должно быть больше, чем 1.Я думаю, что самый простой способ создать список строковых значений через запятую:
Вот полный пример:
Нет необходимости создавать вспомогательную функцию, она встроена в .NET 4.0 и выше.
источник
Сравнивая по производительности, победитель - «Зациклись, добавь и сделай шаг назад». На самом деле «перечислимое и ручное перемещение дальше» - это то же самое хорошо (рассмотрим stddev).
Код:
https://github.com/dotnet/BenchmarkDotNet был использован
источник
Поскольку я пришел сюда во время поиска, чтобы присоединиться к определенному свойству списка объектов (а не его ToString ()), вот дополнение к принятому ответу:
источник
Вот еще один метод расширения:
источник
Я немного опоздал на эту дискуссию, но это мой вклад. Я должен
IList<Guid> OrderIds
быть преобразован в строку CSV, но следующее является общим и работает без изменений с другими типами:Короткий и приятный, использует StringBuilder для создания новой строки, сокращает длину StringBuilder на единицу, чтобы удалить последнюю запятую, и возвращает строку CSV.
Я обновил это, чтобы использовать несколько
Append()
, чтобы добавить строку + запятую. Из отзывов Джеймса я использовал Reflector, чтобы посмотретьStringBuilder.AppendFormat()
. Оказывается,AppendFormat()
использует StringBuilder для создания строки формата, что делает ее менее эффективной в этом контексте, чем просто использование несколькихAppends()
.источник
Что-то немного неопрятно, но это работает:
Дает вам CSV из списка после того, как вы передадите ему конвертер (в этом случае d => d.DivisionID.ToString ("b")).
Хак, но работает - может быть, можно сделать метод расширения?
источник
Вот как я это сделал, используя то, как я это делал на других языках:
источник
Конкретная необходимость, когда мы должны окружать ', например:
источник
У нас есть функция полезности, что-то вроде этого:
Который может быть использован для объединения многих коллекций легко:
Обратите внимание, что у нас есть параметр коллекции до лямбды, потому что intellisense затем выбирает тип коллекции.
Если у вас уже есть перечисление строк, все, что вам нужно сделать, это ToArray:
источник
Вы можете преобразовать IList в массив, используя ToArray, а затем выполнить команду string.join для массива.
источник
Их можно легко преобразовать в массив с помощью расширений Linq в .NET 3.5.
источник
Вы также можете использовать что-то вроде следующего после преобразования в массив с помощью одного из методов, перечисленных другими:
Изменить: вот еще один пример
источник
Я только что решил эту проблему, прежде чем встретиться в этой статье. Мое решение выглядит примерно так:
Называется как:
Я также мог бы так же легко выразиться как таковой и был бы более эффективным:
источник
Мой ответ такой же, как и выше. Агрегатное решение, но оно должно быть менее сложным в стеке вызовов, поскольку нет явных вызовов делегатов:
Конечно, можно расширить подпись, чтобы она не зависела от разделителя. Я действительно не фанат вызова sb.Remove (), и я хотел бы изменить его на прямой цикл while над IEnumerable и использовать MoveNext (), чтобы определить, следует ли писать запятую. Я возьму и выложу это решение, если натолкнусь на него.
Вот что я хотел изначально:
Нет временный массив или список хранения не требуется , и нет
StringBuilder
Remove()
илиLength--
взломать требуется.В моей фреймворковой библиотеке я сделал несколько вариаций сигнатуры этого метода, каждая комбинация включала
delimiter
иconverter
параметры с использованием","
иx.ToString()
как значения по умолчанию, соответственно.источник
Надеюсь, это самый простой способ
источник
Я пришел к этому обсуждению, когда искал хороший метод C # для объединения строк, как это делается с помощью метода MySql
CONCAT_WS()
. Этот метод отличается отstring.Join()
метода тем, что он не добавляет знак разделителя, если строки пустые или пустые.вернет только
Lastname
если имя пустое, авернусь
strLastname + ", "
в том же случае.Желая первого поведения, я написал следующие методы:
источник
Я написал несколько методов расширения, чтобы сделать это эффективным способом:
Это зависит от
источник
Вы можете использовать
.ToArray()
наLists
иIEnumerables
, а затем использовать,String.Join()
как вы хотели.источник
Если строки, к которым вы хотите присоединиться, находятся в списке объектов, то вы также можете сделать что-то вроде этого:
источник