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();