我有两个Level
列表,我想将它们合并到一个只有唯一的列表中
索引,并具有较高的两个高分。
Level对象。
public class Level
{
public int Index { get; set; }
public string User { get; set; }
public int Highscore { get; set; }
public Level(int index,string user, int highscore)
{
Highscore = highscore;
User = user;
Index = index;
}
}
我有这个测试代码
List<Level> Levels = new List<Level>();
List<Level> otherlevels = new List<Level>();
Levels.Add(new Level(1, "Test", 1));
Levels.Add(new Level(2, "Test", 2));
Levels.Add(new Level(3, "Test", 4));
Levels.Add(new Level(4, "Test", 1));
otherlevels.Add(new Level(1, "Test", 4));
otherlevels.Add(new Level(2, "Test", 4));
otherlevels.Add(new Level(3, "Test", 1));
//some linq code here
我想从linq代码中得到的是一个包含这4个项目的列表。
Level(1,"Test",4)
Level(2,"Test",4)
Level(3,"Test",4)
Level(4,"Test",1)
我设法按索引分组并选择第一个,但我不知道如何选择具有最高分数的那个。
答案 0 :(得分:2)
您可以进行外部联接:
from level in levels
join other in otherLevels on level.Index equals other.Index into tmp
from other in tmp.DefaultIfEmpty()
select other == null
? level
: level.HighScore >= other.HighScore ? level : other;
这种方法假设有两件事:
otherLevels
中的每个项目都在levels
中有相应的项目(反之不一定是真的)答案 1 :(得分:2)
听起来你通过分组水平获得90%的方式。现在你只需要命令他们获得最大的得分结果:
List<Level> newLevels = from x in Enumerable.Concat(Levels, otherLevels)
group x by x.Index into grp
select grp.OrderByDescending(x => x.HighScore).First()
除了比Thomas的解决方案更简洁之外,这不具有他的任何限制:它将适用于包含任意数量的重复项的列表,以及一个列表中存在一个级别而另一个列表中不存在级别的实例。 / p>