2011-07-01 77 views
0

我正在为ASP.NET MVC菜单编写一个类。我希望能够采取一切博客条目列表,并与此类似的存档菜单:有没有更好的解决方案这个清单<DateTime>排序?

1/2011 (2) 
3/2011 (1) 
4/2011 (12) 
etc... 

这里是我使用的代码:

public class ArchiveMenuModel 
{ 
    private List<ArchiveMenuItem> menuItems; 
    public List<ArchiveMenuItem> MenuItems { get { return menuItems; } } 

    public ArchiveMenuModel(List<DateTime> dates, string streamUrl) 
    { 
     menuItems = new List<ArchiveMenuItem>(); 
     int itemCount = 0; 
     dates = dates.OrderByDescending(x => x).ToList(); 

     for (int i=0; i<dates.Count; i++) 
     { 
      itemCount++; 
      if(i+1 < dates.Count) 
      { 
       if(!(dates[i].Month == dates[i + 1].Month && dates[i].Year == dates[i + 1].Year)) 
       { 
        menuItems.Add(new ArchiveMenuItem(streamUrl, dates[i].Month, dates[i].Year, itemCount)); 
        itemCount = 0; 
       } 
      } 
      else 
      { 
       menuItems.Add(new ArchiveMenuItem(streamUrl, dates[i].Month, dates[i].Year, itemCount)); 
      } 
     } 

    } 
} 

有没有更好的办法,也许通过使用Linq或什么?具体而言,我不喜欢我的代码的部分是:

if(!(dates[i].Month == dates[i + 1].Month && dates[i].Year == dates[i + 1].Year)) 

如果我能避免这种丑陋的if语句,这将是伟大的!

+0

有LINQ在那里? ;-)请参阅[IEnumerable](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx)中的'OrderBy'和'GroupBy'。后者会让你的团队(然后可以对每个组中的元素进行计数),前者将得到团队的排序。用“花哨的LINQ语法”装饰...或作为常规方法调用离开(我的首选方式)。这不是一个答案,因为我只是不会放下任何代码 - 在[LINQPad](http://linqpad.net)中玩一下并享受! – 2011-07-01 20:41:55

+0

当我尝试的时候,我很难得到入场人数。另外,GroupBy能够按月还是不按时返回DateTime组? – quakkels

+0

你想包括空的月份吗?即如“5/2011(0)”? – svick

回答

2
menuItems = dates 
    .GroupBy(x => new DateTime(x.Year, x.Month, 1)) 
    .Select(x=> new{Date = x.Key, Count = x.Count()}) 
    .OrderByDescending(x => x.Date) 
    .Select(x => new ArchiveMenuItem(streamUrl, 
             x.Date.Month, 
             x.Date.Year, 
             x.Count)) 
    .ToList(); 
+0

不错!得到这个工作呢!无需编辑,谢谢! – quakkels

-1

沿着这些线路的东西应该工作:

menuItems.GroupBy(x => x.Month + "/" + x.Year); 

我不知道持有的DateTime属性的名称,但信息技术司必须建立像,

menuItems.GroupBy(x => x.(datetime).Month + "/" + x.(datetime).Year); 
+0

'列表日期' – quakkels

+0

为什么你会创建一个字符串来做到这一点? – svick

+0

分组工作正常。虽然我不清楚究竟应该在日期时间列表中究竟是什么。 –

0
var memuItems = dates.Select(o => o.Date.AddDays(-o.Date.Day + 1)) 
      .GroupBy(o => o, (o, p) => new {MonthAndYear = o.Date, EntriesCount = p.Count()}) 
      .Select(o => new ArchiveMenuItem(streamUrl, o.MonthAndYear.Month, o.MonthAndYear.Year, o.EntriesCount)); 

我减去日期(到本月的第一天),所以我可以使用年份和月份进行分组。

1
var menuItems = from date in dates 
       group date by new { date.Year, date.Month } into g 
       select new { g.Key.Year, g.Key.Month, Count = g.Count() } into month 
       orderby month.Year, month.Month 
       select new ArchiveMenuItem(streamUrl, month.Month, month.Year, month.Count); 

这LINQ查询

  1. 按年份和月份
  2. 组日期选择日期的年,月,编号为每个组
  3. 订单组通过一年月
  4. 创建ArchiveMenuItem为每个组
+0

感谢您的补充说明。看起来你和Handrcraftsman在做基本相同的事情。 – quakkels

+0

@quakkels,是的,它基本上是一样的。 – svick

0

@svick和@danyolgiax,

这是我从丹妮的链接想出了:

public class ArchiveMenuModel 
{ 
    private List<ArchiveMenuItem> menuItems; 
    public List<ArchiveMenuItem> MenuItems { get { return menuItems; } } 

    public ArchiveMenuModel(List<DateTime> dates, string streamUrl) 
    { 
     menuItems = new List<ArchiveMenuItem>(); 
     dates = dates.OrderByDescending(x => x).ToList(); 

     var grouped = from d in dates 
         group d by new { month = d.Month, year= d.Year } into d  
         select new { dt = d, count = d.Count() }; 
     foreach(var item in grouped) 
     { 
      menuItems.Add(new ArchiveMenuItem(streamUrl, item.dt.Key.month, item.dt.Key.year, item.count)); 
     } 
    } 
} 
相关问题