gpt4 book ai didi

c# - 按日期时间间隔对对象进行分组

转载 作者:行者123 更新时间:2023-12-03 19:42:58 25 4
gpt4 key购买 nike

我有一份用户列表及其注册日期。现在我想按注册日期以 5 分钟为间隔对用户进行分组,如下所示:

Group 1
15:01
15:03
15:04

Group 2
15:06
15:06

Group 3
15:17

Group 4
15:59

我的问题是:为什么这个解决方案给了我正确的答案:

var users = GetUsers();
var interval = 5;

var registerInvervals = users.GroupBy(x => new
{
Month = x.Registered.Month,
Day = x.Registered.Day,
Hour = x.Registered.Hour,
MinuteFrom = (x.Registered.Minute/interval)*interval,
MinuteTo = (((x.Registered.Minute / interval) * interval) + 5)%61
})
.ToList();

但这不是:

var users = GetUsers();
var interval = 5;

var registerInvervals = users.GroupBy(x => new GroupCriteria()
{
Month = x.Registered.Month,
Day = x.Registered.Day,
Hour = x.Registered.Hour,
MinuteFrom = (x.Registered.Minute/interval)*interval,
MinuteTo = (((x.Registered.Minute / interval) * interval) + 5)%61
})
.ToList();

class GroupCriteria
{
public int Month { get; set; }
public int Day { get; set; }
public int Hour { get; set; }
public int MinuteFrom { get; set; }
public int MinuteTo { get; set; }
}

第二个解决方案返回 7 个组,每个组 1 个用户。

最佳答案

这是因为您没有重写 GroupCriteria 类的 EqualsGetHashCode 。调用 GroupBy 时,项目通过共享相同的键进行分组。在指定的情况下,键是您创建的对象,而相等性是为该实例定义的相等性。当对 GroupCriteria 执行此操作时,它会通过默认定义的对象(它们的引用)检查对象的相等性。当您为每个项目投影一个新对象时,引用会有所不同,并且这些组属于单个项目。

对于匿名对象(new {...}),equals 会比较字段,从而起作用。有关此行为的更多信息,您可以阅读 Why does the Equals implementation for anonymous types compare fields? 。正如 Gert 在该问题的回答中所述:

The Equals and GetHashcode methods on anonymous types override the methods inherited from object, and are defined in terms of the Equals and GetHashcode of the properties, so that two instances of the same anonymous type are equal if and only if all their properties are equal.

关于c# - 按日期时间间隔对对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52236161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com