2013-11-17 1 views
5

Можно с одного LINQ запроса преобразовать один одномерный массив так:LINQ запрос, чтобы создать коллекцию объектов вместе взятых из коллекции строк

string[] source = new string[] { "1", "Name1", "Value1", "2", "Name2", "Value2", "3", "Name3", "Value3" }; 

в IEnumerable<> из трех объектов, содержащих три свойства , строить из каждых трех последовательных строк?

+2

Если возможно, я хочу это увидеть; будет очень красивый код. – frenchie

+0

Для справки, некоторые связанные вопросы можно найти по адресу http://stackoverflow.com/questions/1290451/how-to-group-items-by-index-c-sharp-linq и http://stackoverflow.com/questions/860305 /, как в использовании-LinQ-к-группы-каждый-н-число-строк. –

ответ

11

Да, это возможно, вы могли бы сгруппировать их по индексу в массиве:

string[] source = new string[] { "1", "Name1", "Value1", "2", "Name2", "Value2", "3", "Name3", "Value3" }; 
var result = source 
    .Select((element, index) => new { element, index }) 
    .GroupBy(x => x.index/3) 
    .Select(x => new 
    { 
     Id = x.ElementAt(0).element, 
     Name = x.ElementAt(1).element, 
     Value = x.ElementAt(2).element 
    }).ToList(); 

// at this stage the result variable will represent a list of 3 elements where 
// each element is an anonymous object containing the 3 properties. You could of course 
// replace the anonymous object with a model if you intend to use the result of the query 
// outside of the scope of the method it is being executed in. 

Очевидно, что в этом примере нет проверки ошибок. Это то, что вы можете рассмотреть, прежде чем запускать запрос LINQ. Длина массива должна быть делимой на 3, очевидно.

+1

«Очевидно», он войдет в производство, как есть :) –

+0

Ну, я просто упоминаю об этом, потому что я видел, как много людей делали копирование из SO в свой производственный код (включая меня) :-) –

+0

Да , да Дарин .. но просто посмотри, как красиво этот кусок кода ... это искусство. – Marco

Смежные вопросы