2011-11-02 11 views
5

के आधार पर दो सूची मर्ज करें मेरे पास कक्षा पुरस्कार है जो मैं प्रति गेम उपयोगकर्ता धन रखता हूं। मेरे पास दो सूची हैं जो मुझे किसी भी तरह की आवश्यकता है। मैं नीचे नमूना सूचियों और वांछित परिणाम लिखते हैं।कुंजी सी #

public class Reward 
{ 
    public int Game { get; set; } 
    public int User { get; set; } 
    public int Money { get; set; } 

    public Reward Merge(Reward p) 
    { 
     return new Reward { Game = this.Game, User = this.User, Money = this.Money + p.Money}; 
    } 
} 

    IList<Reward> list1 = new List<Reward>(); 
    list1.Add(new Reward {Game = 1, User = 1, Money = 10}); 
    list1.Add(new Reward { Game = 1, User = 2, Money = 20 }); 
    list1.Add(new Reward { Game = 1, User = 3, Money = 30 }); 


    IList<Reward> list2 = new List<Reward>(); 
    list2.Add(new Reward { Game = 2, User = 1, Money = 15 }); 
    list2.Add(new Reward { Game = 2, User = 2, Money = 25 }); 
    list2.Add(new Reward { Game = 2, User = 4, Money = 35 }); 

परिणाम सूची होना चाहिए

User Money 
1 25 
2 45 
3 30 
4 35 

मैं

IList<Reward> listConcat = list1.Concat(list2) 
       .GroupBy(u=> u.User) 
       .Select(???) 
       .ToList(); 

लेकिन कैसे की कोशिश?

उत्तर

4

आप GroupBy साथ सही रास्ते पर थे, यह काम करना चाहिए: लैम्ब्डा अभिव्यक्ति के साथ वही बात:

IEnumerable<Reward> result = list1.Concat(list2) 
    .GroupBy(u => u.User) 
    .Select(g => new Reward 
    { 
     Game = 0, //what game to use? 
     User = g.Key, 
     Money = g.Sum(r => r.Money) 
    }); 
+0

+1 बस इसे बाकी की तुलना में अधिक पठनीय बनाने के लिए –

0

कृपया लाइन बदलने के लिए:

IEnumerable<Reward> result = 
    from r in list1.Concat(list2) 
    group r by r.User into groupedRewards 
    select new Reward 
    { 
     Game = 0, //what game to use? 
     User = groupedRewards.Key, 
     Money = groupedRewards.Sum(r => r.Money) 
    }; 

संपादित:

return new Reward { Game = this.Game, User = this.User, Money = this.Money + p.User 

return new Reward { Game = this.Game, User = this.User, Money = this.Money + p.Money 
0

यह बहुत सुंदर नहीं है, लेकिन यह काम करता है।

var listConcat = list1.Concat(list2) 
       .GroupBy(u=> u.User) 
       .Select(rewards => new Reward { 
               User = rewards.Key, 
               Money = rewards.Select(reward => reward.Money).Sum() 
               } 
         ) 
       .ToList(); 
0

.GroupBy के साथ, आप IGrouping की एक सूची प्राप्त है, तो चयन की तरह तो है:

IEnumerable<Reward> listConcat = list1.Concat(list2) 
           .GroupBy(x => x.User) 
           .Select(x => new Reward { User= x.Key, Money=x.Sum(y => y.Money) }); 
0

मैं पास क्या आप इस तरह दिखता है के लिए देख रहे हैं करने के लिए एक जवाब की कल्पना:

var catList = list1.Concat(list2) 
        .GroupBy (x => x.User) 
        .Select (y => new Reward{Game = 0, Money = y.Sum (z => z.Money), 
           User = y.Key}) 
        .ToList(); 

जहां तक ​​खेल का उपयोग करना है, आप एक अज्ञात चयन (यानी

पर विचार कर सकते हैं 0
.Select(new {Money = y.Sum (z => z.Money), User = y.Key}) 

यह आपको एक अनाम प्रकार देगा जो आपके द्वारा उपयोग की जाने वाली जानकारी रखता है। यदि आप इसे विधि से बाहर करने जा रहे हैं, हालांकि, इसे एक प्रकार देने का सबसे अच्छा अभ्यास है, या बस यह समझें कि गेम 0 आपके सभी गेम का सुपरसैट है।

0
IList<Reward> listConcat = list1.Concat(list2) 
       .GroupBy(person => person.User) 
       .Select(group => group.Aggregate((rewardone, rewardtwo) => rewardone.Merge(rewardtwo))) 
       .ToList(); 
संबंधित मुद्दे