C# LINQ列表排除具有最新日期时间的项

C# LINQ列表排除具有最新日期时间的项,c#,linq,C#,Linq,我有一个对象列表,对象包含一个日期时间 我想使用LINQ排除具有最新日期时间的对象 我正在尝试类似的东西: var excludedList = testdata.Except(testdata.Max(c => c.registeredAt).FirstOrDefault()).ToList(); 但它不起作用,正确的linq应该是什么?您可以尝试以下方法: var excludedList = testdata.OrderByDescending(i => i.register

我有一个对象列表,对象包含一个日期时间

我想使用LINQ排除具有最新日期时间的对象

我正在尝试类似的东西:

var excludedList = testdata.Except(testdata.Max(c => c.registeredAt).FirstOrDefault()).ToList();

但它不起作用,正确的linq应该是什么?

您可以尝试以下方法:

var excludedList = testdata.OrderByDescending(i => i.registeredAt).Skip(1).ToList();

这将按日期对列表进行排序,然后跳过第一项。

您可以尝试以下方法:

var excludedList = testdata.OrderByDescending(i => i.registeredAt).Skip(1).ToList();

这将按日期对列表进行排序,然后跳过第一项。

如果无法重复
registeredAt
日期时间,这是一种可能的方法:

var maxObj = testdata.OrderByDescending(x => x?.registeredAt).First();
var excludedList = testdata.FindAll(x => x != maxObj);

这将保持原始顺序。

如果无法重复
registeredAt
日期时间,这是一种可能的方法:

var maxObj = testdata.OrderByDescending(x => x?.registeredAt).First();
var excludedList = testdata.FindAll(x => x != maxObj);

这将保持原始顺序。

这里有一个解决方案,它不只是为了提取单个最大值而执行整个排序,而是保留序列的顺序。它仍然取决于最大值是否唯一

var maxRegisteredAt = testdata.Max(c => c.registeredAt);
var excludedList = testdata
    .Where(c => c.registeredAt != maxRegisteredAt)
    .ToList();

这里有一个解决方案,它不执行整个排序,只提取单个最大值,并保留序列的顺序。它仍然取决于最大值是否唯一

var maxRegisteredAt = testdata.Max(c => c.registeredAt);
var excludedList = testdata
    .Where(c => c.registeredAt != maxRegisteredAt)
    .ToList();

如果有多条记录具有相同的最新日期时间怎么办?这是不可能的如果有多条记录具有相同的最新日期时间怎么办?这是不可能的这将修改未请求的顺序如果有两条记录具有相同的(最大值)
registeredAt
?在这种情况下,你必须调用
.Skip(2)
。@DmitryBychenko:OP说不是这样possible@TimSchmelter:正确,但在许多情况下,更改订单是可以接受的。具体取决于OP对列表所做的操作。:)@Baldrick:因为
列表是框架中的有序集合之一,所以我不认为这无关紧要。问题是,您无法轻松修改解决方案以恢复原始订单,是吗?这将修改未请求的订单如果有两条记录具有相同(最大值)
registeredAt
?在这种情况下,你必须调用
.Skip(2)
。@DmitryBychenko:OP说不是这样possible@TimSchmelter:正确,但在许多情况下,更改订单是可以接受的。具体取决于OP对列表所做的操作。:)@Baldrick:因为
列表是框架中的有序集合之一,所以我不认为这无关紧要。问题是你不能轻易地修改你的解决方案来恢复原来的顺序,是吗?