2010-06-04 18 views
8

Sadece kafamı Linq'e alıp çok eğleniyorum! herhangi biri için bu bir sorgu ile bana yardım edebilir: LINQ: Bir listeden öğe seçilmesi (Group By/Select/Sum & Max!)

 
    Key Value 
    Aaa 12 
    AaA 10 
    AAa 5 
    BBB 2 
    Bbb 1 
1. Ben Key.ToUpper() Max (Değer) gereken her grup için
2. & Sum göre gruplandırmak istiyorum:
Ben verilerin bir listesi var (Değer) Ben Orada girdileri seçmek istediğiniz her grup için
3. Değer = Maks (değer)
nihai sonuç böyle olmalı:
 
    Key Max Total 
    AaA 12 27 
    AAa 12 27 
    Bbb 2 3
teşekkürler! (Bazı nadiren kullanılır) olduğunu
 
    Key Max Total Correct 
    AaA 12 27 Aaa 
    AAa 12 27 Aaa 
    Bbb 2 3  BBB

+3

Ev ödevi gibi kuşkulu bir şekilde geliyor. –

+0

Veya bir görüşme soru ... ödev genellikle "ToUpper" içermeyen –

+0

Ne ahbap, sadece, ben [artık] gerçekten biraz geçmiş ödev :) Ve yanlısı bir kodlayıcı değilim Profilimden görürdük Eğlenmek için :) –

cevap

16

:)

var results = 
    from kvp in source 
    group kvp by kvp.Key.ToUpper() into g 
    select new 
    { 
    Group = g, 
    Max = g.Max(kvp => kvp.Value), 
    Total = g.Sum(kvp => kvp.Value) 
    } into ag 
    from x in ag.Group //SelectMany 
    where x.Value != ag.Max 
    //for the update to the question - note: possibly ambiguous 
    let correct = ag.Group.Where(y => y.Value == ag.Max).First().Key 
    select new 
    { 
    Key = x.Key, 
    Max = ag.Max, 
    Total = ag.Total, 
    Correct = correct 
    }; 

Ben biraz çünkü tüm küçük parçaların soru gibi:

Update, aslında ben de maksimum girişten Anahtarına ihtiyacınız cevap vermek için gerekli. nasıl bilmiyorsanız bir grup birden toplamaları Sahne


Max = g.Max(kvp => kvp.Value), 
Total = g.Sum(kvp => kvp.Value) 

basit, henüz zordur.


select a into b 

Bu madde daha önce de her şeyi alır ve hedef ile yeni bir sorgu başlatır. Onsuz ben böyle yeni bir sorgu başlatmak zorundayız:

var A = ... select a 

var B = from b in A 

O select into fıkra kapsamından kvp ve g kaldırır dikkat etmek önemlidir.


from b in source 
    from a in b.A //SelectMany 

Bu çocuk koleksiyonunun "açma" Bir hakkındaki bir sorguya b hakkındaki Sorgumda döner. Varsayılan Enumerable.SelectMany aşırı yükünden farklı olarak, üsteki (b) kapsamda bırakır.


where x.Value != ag.Max 

ebeveynin özelliğe sahip bir çocuğun mülkü karşılaştırılması? Hoş. Filtrelemek istediğinizde where'u dağıtmayı unutmamak önemlidir, sadece gruplandırılmış olsanız bile (HAVING yoktur).

+0

Wowsers, hızlı cevap ve mükemmel. Teşekkürler! –

+0

Sevindim LINQ'un daha az kullanılan kısımlarını gıdıklayabilirim. Bence küçük ilaveler biraz daha zorlaştırıyor mu? –

+0

Güncellendi. Belirsizlik, çoklu satırların aynı maksimum değere sahip olma ihtimalinden kaynaklanır. Ayrıca, belirli bir anahtar için tüm satırların aynı değere sahip olması durumunda hiçbir satırın döndürülmediğini belirtmek isterim. –

İlgili konular