我有一个非常讨厌的问题我已经将一组数据分组,我无法获得该组内的数据。我可以得到关键位而不是数据..
我有大量数据,格式为
Data.Period = x
Data.Adjustment = y
我执行GroupBy
var groupedData = Data.GroupBy(x => x.Period new {x.Period});
这带回(根据linq)我的分层数据,它开始看起来我想要它。我喜欢迭代内容但不能......我该怎么做?我该怎么做......
了解如何在不使用投影的情况下访问Data.Adjustment。而且我不想投射,因为我必须执行另一个分组....帮助! : - )
答案 0 :(得分:79)
IGrouping<TKey, TElement>
接口继承IEnumerable<TElement>
:
foreach (var group in groupedData)
{
var groupKey = group.Key;
foreach (var groupedItem in group)
DoSomethingWith(groupKey, groupedItem);
}
我注意到,最好不要在查询中使用它:
var groupedData = Data.GroupBy(x => x.Period);
而不是:
var groupedData = Data.GroupBy(x => new {x.Period});
例如,如果你想平均调整,你可以这样做:
foreach (var group in groupedData)
Console.WriteLine("Period: {0}; average adjustment: {1}", group.Key, group.Average(i => i.Adjustment));
答案 1 :(得分:11)
IGrouping<TKey, TElement>
序列中的每个元素都是IEnumerable<TElement>
,您可以迭代以获取具有公共TKey
的数据:
var groups = Data.GroupBy(x => x.Period);
foreach(var group in groups) {
Console.WriteLine("Period: {0}", group.Key);
foreach(var item in group) {
Console.WriteLine("Adjustment: {0}", item.Adjustment);
}
}
因此,在上文中,groups
是IEnumerable<IGrouping<TPeriod, TAdjustment>>
,其中TPeriod
是Period
的类型(您没有告诉我们),TAdjustment
是Adjustment
的类型。然后,group
是实现IEnumerable<TAdjustment>
的对象(但它也有Key
属性,以便您可以获取密钥。最后,item
是TAdjustment
},并且对于每个group
,来自迭代item
的所有group
都具有相同的密钥。
答案 2 :(得分:8)
只需使用foreach
:
foreach(var group in groupedData)
{
Console.WriteLine("Period: {0}", group.Key);
foreach(var item in group)
Console.WriteLine(" Adjustment: {0}", item.Adjustment);
}
答案 3 :(得分:8)
虽然对其他人来说可能也很明显,但也可以使用:
var groups = Data.GroupBy(x => x.Period);
foreach(var group in groups)
{
List<Data> dataListByPeriod = group.ToList();
//use this list
}
答案 4 :(得分:2)
您也可以使用以下代码。
var groupedData = Data.GroupBy(x => x.Period);
foreach (var group in groupedData) {
var gr = group.FirstOrDefault();
Console.WriteLine("Period: {0}", gr.Period);
Console.WriteLine("Adjustment: {0}", gr.Adjustment);
}