Подтвердить что ты не робот

Сделать 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();
}

Это возвращает "Боб, Нэнси, Джо, Джек"

Ищите помощь в LINQ, чтобы сделать это в одном заявлении. Спасибо!

4b9b3361

Ответ 1

В 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());
    }

Ответ 2

var csv = string.Join(",", MakeStrings().ToArray());

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

Ответ 3

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

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

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

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

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

Ответ 4

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

String csv = parts.Aggregate((s1,s2) => s1+","+s2);

Ответ 5

Я просто использую эту функцию для генерации csv из linq. Это не идеальное, но настраиваемое.

public string generateCsvFromLinqQueryable(IQueryable query,string delimiter,string replaceDelimiterInDataWith)
{
    PropertyInfo[] rowPropertyInfos = null;
    rowPropertyInfos = query.ElementType.GetProperties();

    string result = "";
    foreach (var myObject in query)
    {
        foreach (PropertyInfo info in rowPropertyInfos)
        {
            if (info.CanRead)
            {
                string tmp = Convert.ToString(info.GetValue(myObject, null));
                if (!String.IsNullOrEmpty(tmp))
                {
                    tmp.Replace(delimiter, replaceDelimiterInDataWith);
                }
                result +=  tmp + delimiter;
            }
        }
        result += "\r\n";
    }
    return result;
}

Гарри

Ответ 6

В .net 4.0,

string str = string.Join( ", ", MakeStrings());

Добавление моего ответа здесь как отдельного, так что это станет более понятным для читателей, не ясным в моих комментариях в ответе Дарина Димитрова.