C# 基于键c将两个列表合并到
我有班级奖励,每次游戏我都会保留用户的钱。 我有两张单子,不知怎的,我需要列举出来。我在下面写下示例列表和期望的结果C# 基于键c将两个列表合并到,c#,list,merge,C#,List,Merge,我有班级奖励,每次游戏我都会保留用户的钱。 我有两张单子,不知怎的,我需要列举出来。我在下面写下示例列表和期望的结果 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
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();
但是怎么做呢?请更改行:
return new Reward { Game = this.Game, User = this.User, Money = this.Money + p.User
到
您使用GroupBy的方法是正确的,这应该可以完成以下工作:
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)
};
编辑:与lambda表达式相同:
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)
});
这不是很漂亮,但很管用
var listConcat = list1.Concat(list2)
.GroupBy(u=> u.User)
.Select(rewards => new Reward {
User = rewards.Key,
Money = rewards.Select(reward => reward.Money).Sum()
}
)
.ToList();
使用.GroupBy,您可以得到一个iGroup列表,因此选择如下:
IEnumerable<Reward> listConcat = list1.Concat(list2)
.GroupBy(x => x.User)
.Select(x => new Reward { User= x.Key, Money=x.Sum(y => y.Money) });
我想象一个接近你所寻找的答案是这样的:
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是你所有游戏的超集
IList<Reward> listConcat = list1.Concat(list2)
.GroupBy(person => person.User)
.Select(group => group.Aggregate((rewardone, rewardtwo) => rewardone.Merge(rewardtwo)))
.ToList();
.Select(new {Money = y.Sum (z => z.Money), User = y.Key})
IList<Reward> listConcat = list1.Concat(list2)
.GroupBy(person => person.User)
.Select(group => group.Aggregate((rewardone, rewardtwo) => rewardone.Merge(rewardtwo)))
.ToList();