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

#c# #string

#c# #строка

Вопрос:

У меня есть список этих объектов

 public class OsloProverModel
{
    public string PersonalNumber { get; set; }
    public string SchoolCode { get; set; }
    public string Email { get; set; }
}
  

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

 PN1,SC1,E1
PN2,SC2,E2
....
  

Я пытаюсь выполнить цикл и объединение. Есть ли в Linq способ, которым я могу это сделать?

Комментарии:

1. Переопределить ToString и string.Join(Environment.NewLine, yourItems)

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

3. Переопределение toString() в общем случае не позволяет возвращать значимую строку для целей отладки. Я думаю, лучше создать другой метод либо в объекте, содержащем поля, либо в объекте, сериализующемся в csv

Ответ №1:

Переопределить ToString()

 public class OsloProverModel
{
    public string PersonalNumber { get; set; }
    public string SchoolCode { get; set; }
    public string Email { get; set; }

    public override string ToString()
    {
        return string.Join(",", new[] { PersonalNumber, SchoolCode, Email });
    }
}
  

таким образом, вы можете

 OsloProverModel opmItem = new OsloProverModel()
{
    PersonalNumber = "PN1",
    SchoolCode = "SC1",
    Email = "E1"
};
string result = opmItem.ToString(); //"PN1,SC1,E1"
  

https://dotnetfiddle.net/7l1G2S


или в случае List<OsloProverModel> и файла:

 List<OsloProverModel> opvItems = GetValues();
System.IO.File.WriteAllLines(@"c:myfile.csv", opvItems.Select(x => x.ToString()));
  

Ответ №2:

В общем случае при создании CSV мы должны добавлять кавычки, если строка содержит кавычки " , запятую , или новую строку; давайте реализуем для этого локальную функцию:

   Func<string, string> quote = (source) =>
    string.IsNullOrEmpty(source) ? 
        "" 
      : (source.Any(c => c == ',' || c == '"' || c < ' ')) ? 
        $""{string.Concat(source.Select(c => c == '"' ? """" : c.ToString()))}"" 
      : source;
  

Затем создать коллекцию OsloProverModel (скажем, список)

   List<OsloProverModel> data = ...
  

Наконец, мы можем поместить простой Linq:

   File.WriteAllLines(@"c:MyFile.csv", data
    .Select(item => string.Join(",", 
       quote(item.PersonalNumber), 
       quote(item.SchoolCode),
       quote(item.Email))));