我把我的问题简化了
public class Application
{
public int Id { get; set; }
public int Version { get; set; }
public int Status { get; set; }
}
字符串
我的三个清单:
IEnumerable<Application> applications1 = new List<Application>
{
new Application {Id = 1, Version = 1, Status = 1},
new Application {Id = 2, Version = 1, Status = 1},
new Application {Id = 3, Version = 3, Status = 1}
};
IEnumerable<Application> applications2 = new List<Application>
{
new Application {Id = 1, Version = 2, Status = 2},
new Application {Id = 2, Version = 2, Status = 2},
new Application {Id = 3, Version = 1, Status = 0}
};
IEnumerable<Application> applications3 = new List<Application>
{
new Application {Id = 1, Version = 5, Status = 1},
new Application {Id = 2, Version = 0, Status = 1},
new Application {Id = 3, Version = 6, Status = 1}
};
型
我想制作这个:
IEnumerable<Application> applications4 = new List<Application>
{
new Application {Id = 1, Version = 5, Status = 2},
new Application {Id = 2, Version = 2, Status = 2},
new Application {Id = 3, Version = 6, Status = 1}
};
型
即一个列表,其中的版本和状态的最高值。我已经尝试与LINQ,但我没有得到它。
我最好的是这个,但它只是得到最高版本。我不明白我怎么做时,有2个属性可供选择:
IEnumerable<Application> applications4 = applications1
.Concat(applications2)
.Concat(applications3)
.GroupBy(a => a.Id)
.Select(g => g.Aggregate((acc, curr) => acc.Version > curr.Version ? acc: curr ))
.ToList();
型
3条答案
按热度按时间dw1jzc5e1#
您应该使用
Max()
从分组属性中获取最大值。字符串
bgibtngc2#
你的问题忽略了一个非常重要的问题-哪个属性(版本或状态)更重要?
我假设版本更重要,并创建了一个自定义比较器来对结果进行排序。基本上我想要的是根据应用程序ID对项目进行 * 分组 *,然后获得最高的结果。我使用了自定义比较器来获得它。如果你不想使用比较器,你可以随时将其更改为:.Select(x => x.OrderByDescending(x => x.Version).ThenBy(x => x.Status).First());
字符串
vc6uscn93#
这里有一个更面向OOP的方法,但我希望它看起来更明确。如果你需要一个更复杂的场景,你可以更新
Merge
逻辑。它的复杂度为O(n)(n个元素的数组需要n个“陡峭”才能完成),并使用字典:字符串
关于基准测试结果,它是关于ns的,所以就像一些信息一样:
型
(3列表表示app1 + app2 + app3,1000元素表示每个应用程序有1000个ID可供使用)