2015-06-24 28 views
-2

我使用enumerable和LINQ组来分组来自DataTable的5列数据。现在我需要访问结果中的每一列数据。通过IEnumerable循环<object>

编辑:

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

retrieveItems从哪里来?它不应该是结果吗? – Andrew

+0

使用'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/613130https://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年前写了这篇文章。我不确定,但反射电话可能在外面循环 –