Сделайте CSV из списка строки в LINQ

Привет я хотел бы взять набор списка и генерировать единственную csv строку. Поэтому возьмите это;

List<string> MakeStrings()
{
    List<string> results = new List<string>();
    results.add("Bob");
    results.add("Nancy");
    results.add("Joe");
    results.add("Jack");
    return results;       
}


string ContactStringsTogether(List<string> parts)
{
    StringBuilder sb = new StringBuilder();

    foreach (string part in parts)
    {
        if (sb.Length > 0)
            sb.Append(", ");

        sb.Append(part);
     }
     return sb.ToString();
}

Это возвращает "Bob, Nancy, Joe, Jack"

Поиск справки на LINQ, чтобы сделать это в отдельном операторе.Спасибо!

19
задан user_v 22 May 2012 в 02:11
поделиться

4 ответа

Для этого в LINQ нет ни одной инструкции. Обратите внимание, что вы можете использовать метод Aggregate для этого, но вы будете использовать конкатенацию строк вместо StringBuilder. Я бы подумал о добавлении метода расширения для этого, если вы будете делать это часто:

    public static string ToCsv<T>(this IEnumerable<T> source)
    {
        if (source == null) throw new ArgumentNullException("source");
        return string.Join(",", source.Select(s => s.ToString()).ToArray());
    }
28
ответ дан 30 November 2019 в 02:48
поделиться

Использование LINQ для построения CSV в одном операторе может быть не очень хорошей идеей, особенно если объем данных значительный. Тот факт, что с LINQ что-то возможно, не означает, что это автоматически лучший способ сделать это.

Построение строки CSV по своей природе является операцией, требующей объединения и перераспределения строк. Вы можете использовать String.Join () , но он не будет автоматически экранировать такие символы, как запятые или двойные кавычки. Фактически, существует ряд нетривиальных правил, которые являются частью создания правильно сформированных файлов CSV.

На самом деле вам следует подумать об использовании проверенной библиотеки , которая генерирует правильные данные в формате CSV.

Если вы все же решите написать свою собственную реализацию, имейте в виду, что методы, включающие конкатенацию множества строк (например, Enumerable.Aggregate () , предлагаемый в качестве примера), могут привести к большому количеству промежуточных результатов, throw -away строковые экземпляры, которые снизят производительность. Вы, вероятно, по-прежнему захотите использовать StringBuilder в любой реальной реализации.

Иногда самой ясной и простой структурой кода все же является цикл.

4
ответ дан 30 November 2019 в 02:48
поделиться
var csv = string.Join(",", MakeStrings().ToArray());

Я бы лично порекомендовал вам использовать настоящий парсер CSV вместо того, чтобы пытаться использовать один лайнер, который сломается, если ваши значения содержат запятую. Например. Вы можете прочитать эту статью о развертывании собственного анализатора CSV .

10
ответ дан 30 November 2019 в 02:48
поделиться

Вы можете использовать

String csv = parts.Aggregate((s1,s2) => s1+","+s2);
2
ответ дан 30 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: