2015-06-12 4 views
0

У меня есть класс, как такПреобразование списка <T> в CSV-файл с помощью FileHelpers

public class MyObject 
{ 
    public string Name { get; set; } 
    public string Location {get; set; } 
} 

Это затем преобразуется в списке выше с данными типа. Я хочу использовать filehelpers для преобразования моего объекта списка в строку csv.

В настоящее время я делаю это

List<MyObject> objList = new List<MyObject>(); 

    //populate objList here 
    //.. 
    //.. 

    var feng = new FileHelperEngine<List<MyObject>>(); 
    string str1 = feng.WriteString(new MyObject[] { objList }); 

Это дает мне ошибку

Argument 1: cannot convert from 'MyObject[]' to 
'System.Collections.Generic.IEnumerable<System.Collections.Generic.List<MyObject>' 

Другая ошибка:

Cannot implicitly convert type 
'System.Collections.Generic.List<MyObject>' 
to 'MyObject' 

Как это исправить?

+3

Вы пытаетесь заполнить 'MyObject []' с '' List . См. Проблему? 'MyObject []' должен быть заполнен 'MyObject'. Вы можете просто попробовать метод [ToArray] (https://msdn.microsoft.com/en-us/library/x303t819 (v = vs.110) .aspx) в 'List '. Что-то вроде 'feng.WriteString (objList.ToArray())' –

+1

... и вы, вероятно, захотите изменить параметр типа 'FileHelperEngine' только на' 'без списка. – Rup

+0

Как и в предыдущей, так и в прежней ошибке – user20358

ответ

2

Вместо этого:

var feng = new FileHelperEngine<List<MyObject>>(); 
string str1 = feng.WriteString(new MyObject[] { objList }); 

Вы хотите:

var feng = new FileHelperEngine<MyObject>(); 
string str1 = feng.WriteString(objList); 
0

Ошибки компиляции могут с этим синтаксисом:

new MyObject[] { objList }; 

Фигурные скобки то, что известно как collection initializer , которые ожидают отдельных элементов из коллекции. Поскольку вы создаете массив из MyObject, инициализатор ожидает один объект, но вы передаете набор из них. Если в будущем вам действительно нужно иметь массив (вместо любых других IEnumerable типов), просто вызовите LINQ-х .ToArray()

Как уже отмечалось, .WriteString ищет любой IEnumerable в любом случае, так что просто проходя существующую List<MyObject> является хорошо. Кроме того, общий тип FileHelperEngine<T> ожидает тип, который вы хотите записать, а это всего лишь MyObject, а не коллекция.

var feng = new FileHelperEngine<MyObject>(); 
string str1 = feng.WriteString(objList); 
3

Если тип известен и очень просто, вы можете сделать это без каких-либо внешних библиотек:

File.WriteAllLines("output.csv",list.Select(
    obj => String.Join(", ", new Object[] {obj.Name, obj.Location, ...}) 
)); 
+0

можно ли это сделать без использования файла? Я хочу просто вывести строку. – user20358

+1

Да. Просто замените 'File.WriteAllLines (" filename ", ...' на 'string result = String.Join (Envionment.NewLine, ... 'и все готово. Или используйте foreach и StringBuilder – Zotta

+0

Спасибо Зотта. Пока вы предлагали интересную альтернативу, которую я испытываю к соблазну, я дам правильный ответ Кори ниже, поскольку его ответ использует движок FileHelper, как было задано в вопросе выше. Приостановил оба ваших ответа. – user20358