2015-06-24 2 views
-2

Я использую перечисление и группу LINQ для группировки данных из DataTable с 5 столбцами. Теперь мне нужно получить доступ к каждому столбцу данных в результате.Петля через IEnumerable <object>

EDIT:

private IEnumerable<object> getItemsForDisplay() 
    { 
      var result = toDisplay.AsEnumerable() 
      .GroupBy(x => new 
      { 
       Col1 = x.Field<string>("rItem"), 
       Col2 = x.Field<string>("rMaterial"), 
       Col3 = x.Field<string>("rSpecs") 
      }) 
      .Select(g => new 
      { 
       Col1 = g.Key.Col1, 
       Col2 = g.Key.Col2, 
       Col3 = g.Key.Col3, 
       Col4 = String.Join(", ", g.Select(row => row.Field<string>("rQuantity"))), 
       Col5 = String.Join(", ", g.Select(row => row.Field<string>("rOptional"))), 
      }).ToList(); 
     return result; 
    } 

     //In another function 
     foreach (var item in result) 
     { 
      //item.tostring shows this: {"aaa","bbb","ccc","ddd","eee") 
      //turn it to array string or list to access "aaa".. etc etc 
     } 
+4

Откуда взята информация? Не должно ли это быть результатом? – Andrew

+0

use 'item.Col1',' item.Col2', 'item.Col3', ... – xanatos

+0

Создайте класс вместо анонимного типа –

ответ

3

Имя свойства являются Col1 ... Col5

foreach (var item in result) 
{ 
    Console.WriteLine(item.Col1); 
    Console.WriteLine(item.Col2); 
    Console.WriteLine(item.Col3); 
    Console.WriteLine(item.Col4); 
    Console.WriteLine(item.Col5); 

    // If you want an array: 
    var arr = new string[] { item.Col1, item.Col2, item.Col3, item.Col4, item.Col5 }; 
} 

после пересмотра

Вы не должны переходить к другим функциям/вернуться анонимно объектов (технически вы можете, но не должны). См. https://stackoverflow.com/a/6625008/613130 и https://stackoverflow.com/a/18189923/613130. Вы можете использовать dynamic, если хотите.

foreach (dynamic item in result) 
{ 
    Console.WriteLine(item.Col1); 
    Console.WriteLine(item.Col2); 
    Console.WriteLine(item.Col3); 
    Console.WriteLine(item.Col4); 
    Console.WriteLine(item.Col5); 

    // If you want an array: 
    var arr = new string[] { item.Col1, item.Col2, item.Col3, item.Col4, item.Col5 }; 
} 
+0

, пожалуйста, просмотрите отредактированный код. спасибо за ваше время – Miroxen

+0

@Miroxen Обновленный ответ. – xanatos

+0

Спасибо. Я создал список строк списка, заполнил список тем для каждой строки, а затем добавил его в список строки списка. – Miroxen

0

У меня есть другое решение для этой проблемы, я попробовал, и это сработало для меня. Я использовал отражение, как показано ниже;

IEnumerable<object> query = result.Select(x => new { 
    Col1 = x.GetType().GetProperty("Col1").GetValue(x, null).ToString() ?? "", 
    Col2 = x.GetType().GetProperty("Col2").GetValue(x, null).ToString() ?? "", 
    Col3 = x.GetType().GetProperty("Col3").GetValue(x, null).ToString() ?? "", 
    Col4 = x.GetType().GetProperty("Col4").GetValue(x, null).ToString() ?? "", 
    Col5 = x.GetType().GetProperty("Col5").GetValue(x, null).ToString() ?? "", 
}).ToList(); 
+0

Слишком много вызовов отражения в петле? – huseyint

+0

@huseyint Это определенно не совсем хорошо, и я написал это 1,5 года назад. Я не уверен, но призывы к отражению могли быть вне цикла –

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