按ID合并两个列表,然后选择具有最大值的项目

时间:2014-12-04 15:35:17

标签: c# linq

我有两个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)

我设法按索引分组并选择第一个,但我不知道如何选择具有最高分数的那个。

2 个答案:

答案 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;

这种方法假设有两件事:

  • 每个列表仅包含不同的ID
  • 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>