DateTime按日期或小时分组

时间:2010-03-09 10:35:55

标签: c# .net

01.02.2010 0:00:00 - > 01.02.2010随时

01.02.2010 0:00:00 - > 01.02.2010 0:任何分钟和秒钟

所以这是我的约会对象:

 DateTime x;

它的 01.02.2010 0:00:00 作为一个字符串

 x.Date.ToString()

这里我比较日期

DatarowsForOneDay = dt.Select("DailyRecTime= '" + x.ToString() + "'");

那么如何按日期+小时进行分组,无需关心分钟和秒数。

2 个答案:

答案 0 :(得分:5)

您可以编写自己的IEqualityComparer<DateTime>来仅比较您关注的DateTime部分。 LINQ的GroupBy有一个需要IEqualityComparer的重载。我最近遇到了同样的问题而且做到了这一点。

但是你必须在转换为字符串之前调用GroupBy。如果您不能,那么您可能需要创建IEqualityComparer<string>并在比较之前将字符串解析回DateTime

我现在没有原始代码。我从记忆中重新输入了这个并没有测试它。


public class DateAndHourComparer : IEqualityComparer
{
    public bool Equals(DateTime x, DateTime y)
    {
        var xAsDateAndHours = AsDateHoursAndMinutes(x);
        var yAsDateAndHours = AsDateHoursAndMinutes(y);

        return xAsDateAndHours.Equals(yAsDateAndHours);
    }

    private DateTime AsDateHoursAndMinutes(DateTime dateTime)
    {
        return new DateTime(dateTime.Year, dateTime.Month, 
                            dateTime.Day, dateTime.Hour, 
                            dateTime.Minute, 0);
    }

    public int GetHashCode(DateTime obj)
    {
        return AsDateHoursAndMinutes(obj).GetHashCode();
    }
}

我从来没有使用基于字符串的版本,但它可以使用上面基于DateTime的代码,看起来像......


public class DateAndHourStringComparer : IEqualityComparer
{
    private readonly DateAndHourComparer dateComparer = new DateAndHourComparer();

    public bool Equals(string x, string y)
    {
        var xDate = DateTime.Parse(x);
        var yDate = DateTime.Parse(y);

        return dateComparer.Equals(xDate, yDate);
    }

    public int GetHashCode(string obj)
    {
        var date = DateTime.Parse(obj);
        return dateComparer.GetHashCode(date);
    }
}

我没有测试过,我没有添加空检查或格式检查。该代码旨在展示一般概念。

答案 1 :(得分:1)

您可以使用DateTime.ToString(字符串模式)传递参数。 更多信息@ http://www.geekzilla.co.uk/View00FF7904-B510-468C-A2C8-F859AA20581F.htm