C# 如何使用Linq在DateTime之间分组数据

C# 如何使用Linq在DateTime之间分组数据,c#,linq,datetime,C#,Linq,Datetime,我的学生班是 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日

我的学生班是

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:0:0这些日期时间之间的所有数据必须在单个组中

目前我是这样做的

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();
var groupByAdmsn=listOfStudent。
GroupBy(x=>x.入院<新日期时间(x.入院年,x.入院月,x.入院日,7,0,0)。AddDays(1)&&
x、 入学>=新的日期时间(x.Admission.Year,x.Admission.Month,x.Admission.Day,7,0,0))
.选择(x=>x)
.ToList();

但它不起作用。

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

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();
var groupByAdmsn=listOfStudent。
GroupBy(x=>x.Admission=新日期时间(DateTime.Now.Year、DateTime.Now.Month、DateTime.Now.Day、7,0,0))
.选择(x=>x)
.ToList();

您可以使用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();
            }
    }

上面给出的解只需对Equals方法稍加修改即可正常工作;Equals方法每次都需要返回true,否则它会将数据分组到新组中,即使哈希代码是前一天的。上述代码不适用于2014年11月5日上午6:58:00和2014年11月5日上午6:21:00@ChrisC73我是对的,还是有其他原因导致代码不工作。你完全正确:我已经更新了答案,使用了与hashcode相同的逻辑。
    var groupByAdmsn = listOfStudent.GroupBy(x => x.Admission , new DateComparer());