2012-03-15 14 views
33

Gerçekten sinir bozucu bir sorunu var. Bir dizi veriyi gruplandırdım ve gruptaki verilere ulaşamıyorum. BenBir IGrouping <T> Arabirimini nasıl yineleyebilirim?

Ben GroupBy

var groupedData = Data.GroupBy(x => x.Period new {x.Period}); 

Bu geri getiriyor (göre performansını

Data.Period = x 
Data.Adjustment = y 

formda bir veri yüküne sahip .. anahtar ucunun değil veri alabilirsiniz linq) hiyerarşik verilerim, nasıl istediğime bakmaya başlıyor. İçeriği yinelemeyi sever ama yapamaz ... Bunu nasıl yaparım? ve nasıl yapabilirim?

Bir projeksiyon kullanmadan Data.Adjustment'a nasıl gidileceğini öğrenin. Ve henüz proje yapmak istemiyorum çünkü başka bir gruplandırma yapmak zorundayım .... yardım! :-)

cevap

62

IGrouping<TKey, TElement> arayüzü devralır IEnumerable<TElement>:

foreach (var group in groupedData) 
{ 
    var groupKey = group.Key; 
    foreach (var groupedItem in group) 
     DoSomethingWith(groupKey, groupedItem); 
} 

sana ancak, sorgu için bu kullanarak daha iyi olacağını da unutmayın:

Bu ziyade
var groupedData = Data.GroupBy(x => x.Period); 

: Örneğin, ayarlamalar ortalamasını istedi Eğer

var groupedData = Data.GroupBy(x => new {x.Period}); 

, bunu yapabilirdi: diğerleri için

foreach (var group in groupedData) 
    Console.WriteLine("Period: {0}; average adjustment: {1}", group.Key, group.Average(i => i.Adjustment)); 
+0

Merhaba kodunuzdaki son foreach ifadesinde grupta bir sorguyu nasıl yaparım? Bunu bir noksiye nasıl dağıtabilirim? – Exitos

+0

@Exitos'u bir "IGroup" a göndermeniz gerekmez; zaten * bir "IGroup". Örnek için düzenlenmiş cevaba bakınız. – phoog

+0

O zaman, ilk foreach bildiriminizden sonra grubu nasıl sorgulayabilirim? teşekkürler btw – Exitos

6

Sadece foreach kullanın:

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); 
    } 
} 

:

foreach(var group in groupedData) 
{ 
    Console.WriteLine("Period: {0}", group.Key); 
    foreach(var item in group) 
     Console.WriteLine(" Adjustment: {0}", item.Adjustment); 
} 
+0

Harika teşekkürler! :-) – Exitos

10

IGrouping<TKey, TElement> bir dizi her bir öğesi, bir TKey ortak sahip veri almak için adımlayabilirsiniz dair bir IEnumerable<TElement> olduğunu Yani, yukarıdaki groupsTPeriodTPeriodPeriod türüdür (bize söylemediniz) ve TAdjustment türünde bir IEnumerable<IGrouping<TPeriod, TAdjustment>> olduğunu Adjustment. Ardından groupIEnumerable<TAdjustment> uygulayan bir nesnedir (ancak anahtarı alabilmeleri aynı zamanda bir Key özelliğine sahiptir. Son olarak, item bir TAdjustment ve her group için, tüm group aynı olması yineleme gelen item . tuşu

+0

Merhaba Bu gerçekten yararlı oldu Teşekkürler – Exitos

6

olsa belki bariz bir de kullanabilirsiniz:

var groups = Data.GroupBy(x => x.Period); 

foreach(var group in groups) 
{ 
    List<Data> dataListByPeriod = group.ToList(); 
    //use this list 
} 
+0

Yup, Ben grup (group.Key) .ToList() thx yapmak zorunda sanıyordum – masteroleary

İlgili konular