2011-07-01 33 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)); 
     } 
    } 
} 
相關問題