C# 用LINQ合并两个IEnumerable

C# 用LINQ合并两个IEnumerable,c#,.net,linq,C#,.net,Linq,我有以下课程 public class Application { public int Id { get; set; } public int Version { get; set; } (...) } 我有以下IEnumerable: 您可以通过以下方式使用并选择组中的最大值: IEnumerable final=应用程序1 .Concat(应用程序2) .GroupBy(a=>a.Id) .选择(g=>g.Aggregate((会计科目,当前)=>acc.Ve

我有以下课程

public class Application
{
    public int Id { get; set; }

    public int Version { get; set; }

    (...)
}
我有以下
IEnumerable

您可以通过以下方式使用并选择组中的最大值:

IEnumerable final=应用程序1
.Concat(应用程序2)
.GroupBy(a=>a.Id)
.选择(g=>g.Aggregate((会计科目,当前)=>acc.Version>curr.Version?会计科目:当前))
.ToList();

一种更具程序性的方法是:

var concat = applications1.Concat(applications2)
    .ToArray();

var final = concat
    .GroupBy(a => a.Id)
    .Select (g => new
    {
        ApplicationId = g.Key,
        MaxVersion = g.Max(i => i.Version)
    })
    .Select(i => concat.FirstOrDefault(
        existing => existing.Id == i.ApplicationId && 
                    existing.Version == i.MaxVersion))
    .ToList();

为什么不写这样的东西呢

var结果=应用程序1
.Concat(应用程序2).GroupBy(x=>x.Id)
.Select(g=>newapplication{Id=g.Key,Version=g.Max(a=>a.Version)});
连接两个集合,按
Id
对项目进行分组,然后选择新的
应用程序
实例,并将组键作为
Id
和max
版本

如果不想创建新的
应用程序
实例,以下代码可能会有所帮助,方法是为每个组查找max
版本
,并返回一个具有max
版本
值的
应用程序

var结果=应用程序1
.Concat(应用程序2).GroupBy(x=>x.Id)
.选择(g=>
{
var maxVersion=g.Max(a=>a.Version);
返回g.First(a=>a.Version==maxVersion);
});

@PavelAnikhouski在
版本上不会做任何事情。因此,这两个版本中的哪一个会幸存下来是完全随机的。这是否回答了你的问题@PavelAnikhouski没有真正回答我的问题,因为他的物体实际上是相等的,我的物体不是,但是谢谢你提出这个问题。这回答了你的问题吗?我知道这在给出的示例中是可行的,但它假设类只有两个属性,并且都有一个setter,因此可以构造一个新对象。不幸的是,这里的情况并非如此。我仍然在投票,因为在给出的例子中它确实有效given@cogumel0是的,我假设你的例子。如果这里有更多的属性,你应该考虑如何管理它们——添加到分组中,使用第一个/最后一个/平均值/最大值等等,我猜我想说的是,我认为有更好的方法不涉及重新创建对象。
IEnumerable<Application> final = new List<Application>
{
    new Application {Id = 1, Version = 2},
    new Application {Id = 2, Version = 1},
    new Application {Id = 3, Version = 3},
    new Application {Id = 4, Version = 1}
}
IEnumerable<Application> final = applications1
    .Concat(applications2)
    .GroupBy(a => a.Id)
    .Select(g => g.Aggregate((acc, curr) => acc.Version > curr.Version ? acc: curr))
    .ToList();
var concat = applications1.Concat(applications2)
    .ToArray();

var final = concat
    .GroupBy(a => a.Id)
    .Select (g => new
    {
        ApplicationId = g.Key,
        MaxVersion = g.Max(i => i.Version)
    })
    .Select(i => concat.FirstOrDefault(
        existing => existing.Id == i.ApplicationId && 
                    existing.Version == i.MaxVersion))
    .ToList();