我有以下几点:
var items = new List<CustomItem>
{
new CustomItem()
{
Id = 90, // int
ParentId = 10, // int
CreateDate = '1/19/2020 1:04 PM' // DateTime
},
new CustomItem()
{
Id = 91,
ParentId = 10,
CreateDate = '1/19/2020 1:04 PM'
},
new CustomItem()
{
Id = 92,
ParentId = 10,
CreateDate = '1/19/2020 2:32 PM'
}
};
现在我想做的是GroupBy
CreateDate
然后OrderBy
并选择每个组中的第一个。
所以,我有以下代码,我希望只有 ID 为 90 和 91 的项目,但我得到了所有三个。就好像 GroupBy
只按日期分组,而不是按时间分组。这是它的工作原理还是我遗漏了什么?
当前代码:
var newItems = items.Where(item => item.ParentId == 10).GroupBy(item => item.CreateDate).Select(grp => grp.OrderBy(x => x.CreateDate).First())
答案 0 :(得分:1)
可以有多个不同的 DateTime
值,其字符串表示(在某些文化中)是 "1/19/2020 1:04 PM"
。 DateTime
的精度为 100 纳秒。如果两个 DateTime
相差 1 微秒,则它们可能看起来与您相同,但最终仍会归入不同的组(因为它们不完全相等)。
此外,根据您的描述,您似乎想对组进行排序,而不是对每个组的成员进行排序,因此:
items.Where(item => item.ParentId == 10)
.GroupBy(item => item.CreateDate)
.OrderBy(grp => grp.Key)
.First()