如何使用Linq在DateTime之间对数据进行分组

本文关键字:数据 之间 何使用 Linq DateTime | 更新日期: 2023-09-27 18:28:55

我的学生班是

class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int ID { get; set; }
    public DateTime Admission{get; set;}
}

我想对日期时间之间的数据进行分组,其中入院必须在今天早上7点到第二天早上7点之间,例如:-2014年4月11日7:0:0和2014年5月11日7:00这些日期时间之间所有数据都必须在一个组中

目前我正在这样做

var groupByAdmsn = listOfStudent.
GroupBy(x => x.Admission < new DateTime(x.Admission.Year, x.Admission.Month, x.Admission.Day, 7, 0, 0).AddDays(1) &&
 x.Admission >= new DateTime(x.Admission.Year, x.Admission.Month, x.Admission.Day, 7, 0, 0))
.Select(x => x)
.ToList();

但它不起作用。

如何使用Linq在DateTime之间对数据进行分组

您可以使用IEqualityComparer:

public class DateComparer : IEqualityComparer<DateTime>
    {
            public bool Equals(DateTime x, DateTime y)
            {
                    return GetHashCode(x) == GetHashCode(y);
            }
            public int GetHashCode(DateTime dt)
            {
                    // Normalise unique hashcode to single group time [before 7am uses the previous day]
                    DateTime hashDt = new DateTime(dt.Year, dt.Month, dt.Day);
                    if (dt.Hour < 7)
                    {
                            hashDt = hashDt.AddDays(-1);
                    }
                    return hashDt.GetHashCode();
            }
    }

呼叫示例:

    var groupByAdmsn = listOfStudent.GroupBy(x => x.Admission , new DateComparer());

这对您不起作用,因为您使用Admission中的日期来创建要比较的新日期时间,您必须使用today日期时间(或您想要的其他特定日期)来创建新日期时间。试试这个:

var groupByAdmsn = listOfStudent.
GroupBy(x => x.Admission < new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 7, 0, 0).AddDays(1) &&
 x.Admission >= new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 7, 0, 0))
.Select(x => x)
.ToList();