2012-03-16 14 views
10

उदाहरण के लिए, मैं LINQ का उपयोग करके GroupId द्वारा निम्न रिकॉर्ड्स को कैसे समूहित कर सकता हूं, और प्रत्येक समूह में अन्य सभी स्तंभों को समेट सकता हूं? (इस प्रकार से एक में प्रत्येक समूह में सभी पंक्तियों विलय)LINQ का उपयोग करके समूह द्वारा रिकॉर्ड्स को मर्ज/योग कैसे करें?

var list = new List<Foo>() 
{ 
    new Foo() { GroupId = 0, ValueA = 10, ValueB = 100 }, 
    new Foo() { GroupId = 1, ValueA = 30, ValueB = 700 }, 
    new Foo() { GroupId = 1, ValueA = 40, ValueB = 500 }, 
    new Foo() { GroupId = 2, ValueA = 80, ValueB = 300 }, 
    new Foo() { GroupId = 2, ValueA = 20, ValueB = 200 }, 
    new Foo() { GroupId = 2, ValueA = 20, ValueB = 200 } 
}; 

अपेक्षित परिणाम है:

| GroupId | ValueA | ValueB | 
|---------|--------|--------| 
| 0 | 10 | 100 | 
| 1 | 70 | 1200 | 
| 2 | 120 | 700 | 

उत्तर

13
list.GroupBy(i => i.GroupId) 
    .Select(g => new { GroupId = g.Key, 
         ValueA = g.Sum(i => i.ValueA), 
         ValueB = g.Sum(i => i.ValueB)}); 

या सिर्फ मनोरंजन के लिए आप अपने अधिभार का उपयोग कर एक GroupBy कॉल के भीतर यह कर सकते हैं:

list.GroupBy(i => i.GroupId, 
     (key, groupedItems) => new { 
             GroupId = key, 
             ValueA = groupedItems.Sum(i => i.ValueA), 
             ValueB = groupedItems.Sum(i => i.ValueB), 
            }); 

या आप Aggregate का उपयोग बार-बार दोहराना प्रत्येक समूह में कई बार से बचने के लिए कर सकते हैं:

list.GroupBy(i => i.GroupId) 
    .Select(g => g.Aggregate((i1, i2) => new Foo{ GroupId = i1.GroupId, 
                ValueA = i1.ValueA + i2.ValueA, 
                ValueB = i1.ValueB + i2.ValueB, 
               })); 
3

उपयोग GroupBy उनके GroupId के आधार पर समूहों में Foo रों इकट्ठा करने के लिए, और उसके बाद प्रत्येक के लिए एक नई वस्तु बनाने परिणाम की "पंक्ति" (वह ऑब्जेक्ट आपके द्वारा दिए गए कोड के आधार पर Foo हो सकता है, लेकिन यह अनाम प्रकार सहित कुछ और आसानी से हो सकता है)। उस समय आप अन्य मूल्यों को भी जोड़ देंगे।

var sums = list.GroupBy(f => f.GroupId) 
       .Select(g => new Foo 
       { 
        GroupId = g.Key, 
        ValueA = g.Sum(f => f.ValueA), 
        ValueB = g.Sum(f => f.ValueB) 
       }).ToList(); 
5
var query = list.GroupBy(x=> x.GroupId) 
       .Select(g=> new 
        { 
        GroupId = g.Key, 
        ValueA = g.Sum(x => x.ValueA), 
        ValueB = g.Sum(x => x.ValueB) 
        }); 
0

लैम्ब्डा भाव से बचना (लगभग) और एक "विशुद्ध रूप से" LINQ तरह से उपयोग करते हुए:

var sums = from foo in list 
    group foo by foo.GroupId into groupings 
    orderby groupings.Key ascending 
    select new 
    { 
     GroupId = groupings.Key, 
     ValueA = groupings.Sum(g => g.ValueA), 
     ValueB = groupings.Sum(g => g.ValueB) 
    }; 

मुझे लगता है LINQ में थोड़ा और अधिक प्राकृतिक भाषा, देख लैम्ब्डा की तुलना में (न कुछ ऐसा है जिसे साथ कुछ गड़बड़ है कि। ..)

संबंधित मुद्दे