System.Array в POCO с использованием LINQ

Я читаю данные с листа Excel, поэтому у меня есть этот код для получения нужной области;

Excel.Range range = (Excel.Range)worksheet.get_Range("A9", "AO" + (worksheet.UsedRange.Rows.Count).ToString());
System.Array rangeCells = (System.Array)range.Cells.Value;

Итак, мои данные имеют длину x и ширину 41 ячейки, поэтому мой массив выглядит так:

rangeCells[1,1] through to rangeCells[1,41] is line 1
rangeCells[2,1] through to rangeCells[2,41] is line 2

и так далее до конца.

Кто-нибудь знает способ LINQ получить каждую строку в объект?


person griegs    schedule 02.07.2013    source источник
comment
Зачем вам LINQ?   -  person I4V    schedule 03.07.2013
comment
Как будет выглядеть объект?   -  person p.s.w.g    schedule 03.07.2013
comment
@ I4V Зачем тебе воздух, чтобы дышать?   -  person Federico Berasategui    schedule 03.07.2013
comment
@ I4V Зачем мне linq? Потому что повторение всей коллекции, создающей POCO вручную, не кажется эффективным.   -  person griegs    schedule 03.07.2013
comment
p.s.w.g объект будет выглядеть как класс с 41 свойством. Названия которых, я думаю, не имеют отношения к вопросу.   -  person griegs    schedule 03.07.2013
comment
Каким образом эффективно? Насколько уродлив/чист ваш код и насколько легко его поддерживать? Или эффективен в том, насколько быстро он выполняется во время выполнения?   -  person Chris Sinclair    schedule 03.07.2013
comment
@griegs Похоже, вы используете многомерный массив, с которым linq не может справиться. stackoverflow.com/questions/2562817 /   -  person RandomWebGuy    schedule 03.07.2013
comment
@ChrisSinclair, я думаю, с точки зрения чистого кода. В этом листе будет всего около 200 строк, поэтому он будет быстрым, несмотря ни на что. Однако я просто хотел бы иметь меньше кода и меньше создавать объекты вручную. Это не один из тех вопросов, которые сделают или сломают приложение, это приятно иметь   -  person griegs    schedule 03.07.2013
comment
@griegs Таким образом, у вас будет какой-то код вроде new myObj() { Prop1 = rangeCells[1,0], Prop2 = rangeCells[1,1], SomeOtherProp = rangeCells[1,3], YetAnotherProp = rangeCells[1,4] .... }; для всех 41 свойства, но каким-то образом сжатый/более чистый/автоматизированный с помощью LINQ (или другого механизма?) (EDIT: и, конечно же, увеличение строки)   -  person Chris Sinclair    schedule 03.07.2013
comment
@HighCore Не комментируйте только для того, чтобы комментировать. Линк хорош, но не нужен. griegs, Linq не сделает ваш код более эффективным.   -  person I4V    schedule 03.07.2013
comment
@RandomWebGuy, да, это многомерный массив, и, судя по этой ссылке и моим собственным испытаниям, я думаю, вы можете быть правы. напишите это как ответ   -  person griegs    schedule 03.07.2013
comment
@ I4V, О, я знаю, что это не будет более эффективно, как я уже сказал, это приятно, когда код выглядит немного чище, вот и все.   -  person griegs    schedule 03.07.2013
comment
@griegs Это правда? Похоже на два вложенных цикла, которые yield return нужных вам объектов будут достаточно чистыми. Определенно чище, чем беспорядок Enumerable.Range()s, чтобы сделать это с помощью методов LINQ.   -  person millimoose    schedule 03.07.2013
comment
@griegs На самом деле, сотрите это, по-видимому, вы можете foreach работать с многомерным массивом.   -  person millimoose    schedule 03.07.2013
comment
@millimoose, правда? Даже не рассматривал это. Взглянем сейчас. Yield тоже может быть неплохим подходом.   -  person griegs    schedule 03.07.2013
comment
@griegs Судя по ссылкам RandomWebGuy, кажется, что многомерные массивы, однако, реализуют неуниверсальные IEnumerable. Так что range.Cells.Value.Cast<whatever>().Select() тоже вариант.   -  person millimoose    schedule 03.07.2013
comment
@millimoose, Ах, верно. Только что закончил цикл и создание poco вручную, но рассмотрю это позже сегодня. еще раз спасибо   -  person griegs    schedule 03.07.2013


Ответы (1)


Я не верю, что это возможно, потому что многомерные массивы не реализуют IEnumerable

Обсудили еще:

person RandomWebGuy    schedule 02.07.2013
comment
@AbeMiessler Рассматривая LINQ-to-Objects как набор методов расширения над IEnumerable(T), тот факт, что только одномерные массивы реализуют этот интерфейс, был бы камнем преткновения. - person millimoose; 03.07.2013
comment
@KevinBabcock Если под этим вы подразумеваете, что делаете что-то для выравнивания массива, то на самом деле вы больше не работаете с 2D-массивом. (Я признаю, что это расщепление волос, но одна только двусмысленность означает, что этот ответ не является неправильным сам по себе, если не особенно полезен.) - person millimoose; 03.07.2013
comment
@millimoose согласился (удалил мой комментарий) - person Kevin Babcock; 03.07.2013