C# 组按日期字段列出 - 每周

标签 c# asp.net asp.net-mvc

我有下一个实体“新闻”的列表

class News
{
    public virtual int Id { get; protected set; } 

    public virtual string Content { get; protected set; }

    public virtual DateTime Date { get; set; }
 }

现在我想获取按周分组的数量。

这是我的方法:

public Dictionary<DateTime, int> GetCountByWeek(DateTime fromDate)
{
     var vals =
            from l in session.Query<News>().ToList()
            where l.Date > fromDate
            group l by (l.Date.DayOfYear - FirstMonday(fromDate.Year)) / 7
                into gr
                select new { Key = new DateTime(gr.Min(m => m.Date.Year), gr.Min(m => m.Date.Month), gr.Min(m => m.Date.Last(DayOfWeek.Monday).Day)), Value = gr.Count() };
        return vals.ToDictionary(l => l.Key, l => l.Value);
}

使用 FromDate 获取第一个星期一的函数:

public static int FirstMonday(int year)
{
        int day = 0;

        while ((new DateTime(year, 01, ++day)).DayOfWeek != System.DayOfWeek.Monday) ;

        return day;
}

这应该返回字典,其中包含一周第一天的日期以及该周的新闻计数,例如:

07.03.2016 => 15,
14.03.2016 => 7,
21.03.2016 => 8,

等等...

这不能很好地工作,因为它返回重复的日期键,例如:

07.03.2016 => 15,
07.03.2016 => 7,
14.03.2016 => 8,

但它应该是这样的:

07.03.2016 => 15,
14.03.2016 => 7,
21.03.2016 => 8,

我不太擅长这些事情,所以如果有人可以告诉我我在这里做错了什么。

最佳答案

我只是使用日期作为组键:

public Dictionary<DateTime, int> GetCountByWeek(DateTime fromDate)
{
     var vals =
            from l in session.Query<News>().ToList()
            where l.Date > fromDate
            group l by MyMonday(l.Date.Date) // Use Date.Date to ignore any time values
                into gr
                select new { Key = gr.Key, Value = gr.Count() };
        return vals.ToDictionary(l => l.Key, l => l.Value);
}

以及 MyMonday 方法:

public static DateTime MyMonday(DateTime date)
{
    var myMon = date;
    while (myMon.DayOfWeek != System.DayOfWeek.Monday) {
        myMon = myMon.AddDays(-1);
    }
    return myMon;
}

关于C# 组按日期字段列出 - 每周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185980/

相关文章:

c# - WPF 媒体元素,带有 https 的源失败

c# - 要调用此方法, "Membership.Provider"属性必须是 "ExtendedMembershipProvider"的实例

asp.net - 如何在没有登录控制的情况下使用表单例份验证?

c# - 删除没有后代的 XML 节点

asp.net - 服务器控件和 MVC

c# - linq 中是否有一个哑巴 "all"评估所有元素?

c# - 如何使用 FluentAssertions 测试嵌套集合

javascript - JQuery DataTable设置默认空搜索Echo参数

asp.net-mvc - MVC - 如何 Hook Controller 操作以便在 View 返回到浏览器之前更改 View ?

c# - 如何在 C# Winform 中更改文本框中某些子字符串的字体颜色?