c# - 检查列表是否包含一个属性相同的对象的优雅方法,并且仅在另一个属性的日期较晚时才替换

标签 c# .net linq list comparison

我有一个类如下:

Object1{
   int id;
   DateTime time;
}

我有一个 Object1 列表。我想循环遍历另一个 Object1 列表,搜索具有相同 ID 的 Object1 ,如果时间值晚于时间值,则在第一个列表中替换它列表。如果该项不在第一个列表中,则添加它。

我确定有一种优雅的方法可以做到这一点,也许是使用 linq? :

List<Object1> listOfNewestItems = new List<Object1>();
List<Object1> listToCycleThrough = MethodToReturnList();
foreach(Object1 object in listToCycleThrough){
   if(listOfNewestItems.Contains(//object1 with same id as object))
   {
      //check date, replace if time property is > existing time property 
   } else {
      listOfNewestItems.Add(object)
}

显然这是非常困惑的(而且甚至没有检查属性,这又变得更加困惑......),有没有更简洁的方法来做到这一点?

最佳答案

var finalList = list1.Concat(list2)
                     .GroupBy(x => x.id)
                     .Select(x => x.OrderByDescending(y=>y.time).First())
                     .ToList();

这里是完整的测试代码

public class Object1
{
    public int id;
    public DateTime time;
}

List<Object1> list1 = new List<Object1>() 
{
    new Object1(){id=1,time=new DateTime(1991,1,1)},
    new Object1(){id=2,time=new DateTime(1992,1,1)}
};

List<Object1> list2 = new List<Object1>() 
{
    new Object1(){id=1,time=new DateTime(2001,1,1)},
    new Object1(){id=3,time=new DateTime(1993,1,1)}
};

和输出:

1 01.01.2001 
2 01.01.1992 
3 01.01.1993 

关于c# - 检查列表是否包含一个属性相同的对象的优雅方法,并且仅在另一个属性的日期较晚时才替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12638372/

相关文章:

c# - PInvoke 在类定义中不起作用

c# - 单击 NavMenu 时 Blazor 不会更新

c# - 如何在没有数据库的情况下验证 LINQ 可查询

c# - C# 中的简单 LINQ 问题

c# - 使用Linq和C#从DataTable中选择Distinct

c# - PublicClientApplicationBuilder 和 TokenCacheHelper

c# - 为什么 C# 中 Int32 结构的 MinValue 前面有两个减号?

C# : How to sort a list of object based on a list of string

.net - 将 Silverlight 连接到本地计算机的 COM 端口

.net - 是否可以在 VBScript 中获取 .Net 字符串对象实例?