Если у меня есть список объектов под названием "Автомобиль":
public class Car
{
public string Name;
public int Year;
public string Model;
}
Как я преобразовываю список объектов, например, Список <Автомобиль> к csv?
Объединение значений, разделенных запятыми, я всегда хотел указать на сильно недооцененный string.Join (разделитель строк, элементы string [])
статический метод, но если есть вспомогательные библиотеки, это, вероятно, лучше.
Посмотрите на библиотеку FileHelpers.
С сайта:
FileHelpers - это бесплатная и простая в использовании библиотека .NET для импорта/экспорта данных из записей фиксированной длины или разграниченных записей в файлах, строках или потоках.
Это гарантирует, что всевозможные проблемы с окончанием строк, экранированием и т.п. будут обработаны правильно, согласно RFC-4180.
добавьте следующий метод в Car:
String Escape(String s)
{
StringBuilder sb = new StringBuilder();
bool needQuotes = false;
foreach (char c in s.ToArray())
{
switch (c)
{
case '"': sb.Append("\\\""); needQuotes = true; break;
case ' ': sb.Append(" "); needQuotes = true; break;
case ',': sb.Append(","); needQuotes = true; break;
case '\t': sb.Append("\\t"); needQuotes = true; break;
case '\n': sb.Append("\\n"); needQuotes = true; break;
default: sb.Append(c); break;
}
}
if (needQuotes)
return "\"" + sb.ToString() + "\"";
else
return sb.ToString();
}
public void SerializeAsCsv(Stream stream)
{
stream.Write(Escape(Name));
stream.Write(",");
stream.Write(Year.ToString());
stream.Write(",");
stream.Write(Escape(Model));
stream.Write("\n");
}
Теперь вы можете сериализовать весь список:
foreach (Car car in list)
{
car.SerializeAsCsv(stream);
}
После ввода KEY INDEX необходимо указать имя индекса, а не столбец. Чтобы найти имя индекса в идентификаторе столбца, введите sp _ help StartName
, и в этой таблице появится список индексов. Pk будет назван примерно как PK_xxxxx. Используйте это имя индекса вместо «ID».
Вместо указания имени столбца укажите имя индекса. Вы можете найти имя индекса первичного ключа, как:
select name from sysindexes where object_id('DomainName') = id
Затем вы можете создать полнотекстовый индекс, как:
CREATE FULLTEXT INDEX ON DomainName
(
MiddlePart
Language 0X0
)
KEY INDEX PK__DomainName__40E497F3 ON domaincatalog
WITH CHANGE_TRACKING AUTO
-121--1613494- Я бы реализовал некоторые дополнительные сериализации поведения согласно этой статье . Если требуется получить новый вид, можно создать настройку в свойствах проектов. Этот настраивать определяет, используется ли классом сериализация csv или по умолчанию. Затем вы получите доступ к нему с помощью методов, показанных здесь . Попробуйте использовать статический конструктор для чтения приложений и сделать логическое значение доступным для кода сериализации. Код Влада выглядит отлично, просто подключите его к коду. Также можно рассмотреть другие, возможно, более желательные способы изменить поведение сериализации.
Или создайте интерфейс с именем «SerialityAsCSV» и используйте его следующим образом:
//Частичное содержимое MyCoolClass.csv:
public class MyCoolClass : ISerializeAsCSV, IDisposable
{
protected static bool serializesToCSV = false;
static MyCoolClass()
{
serializesToCSV =
(typeof(MyCoolClass).GetInterface("GrooveySoft.Shared.Interfaces.ISerializeAsCSV") == null)
? false
: true;
}
public MyCoolClass(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
// your stuff here
}
public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
// your stuff here
}
}
//Содержимое ISerializeAsCSV.cs
using System.Runtime.Serialization;
namespace GrooveySoft.Shared.Interfaces
{
/// <summary>
/// indicates that implementor will serialize to csv format
/// </summary>
public interface ISerializeAsCSV : ISerializable
{
}
}
. Я не собирал и не тестировал это. но у вас есть общая идея.