2011-11-02 18 views
5

私はゲームごとにユーザーのお金を保つクラスの報酬を持っています。 私は何とか2つのリストを持っているので、私は結びつく必要があります。私は以下のサンプルリストと望ましい結果を書いています。キーCに基づいて2つのリストをマージする

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

結果一覧は、私が

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

が、どのようにしてみてください

User Money 
1 25 
2 45 
3 30 
4 35 

すべきですか?

答えて

4

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

を:

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

EDIT:ラムダ式で同じこと:

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

行に変更してください:あなたは、この仕事をする必要があり、GROUPBYと正しい軌道に乗っていた

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

これは非常にきれいではないですが、それは動作します。 .GroupBy

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

選択がとても似ているので、あなたは、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(); 

どのゲームを使用するかは、匿名による選択(すなわち、

.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(); 
関連する問題