#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))));