私は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))
文の場合、私は、このような醜いを避けることができれば、それは素晴らしいことです!
は、LINQは、そこにありますか? ;-) [IEnumerable](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx)にある「OrderBy」と「GroupBy」を参照してください。後者はあなたのグループを取得し(各グループの要素を数えることができます)、前者はグループを注文します。 「派手なLINQ構文」で飾るか、通常のメソッド呼び出し(好きな方法)のままにしておきます。これは答えではありません。なぜなら、私はちょっとコードを叩くつもりはないからです。[LINQPad](http://linqpad.net)で少し遊んでお楽しみください! –
私がそれをしようとしていたとき、私はエントリカウントを得るのが難しかった。また、 'GroupBy'は' DateTime'グループを月ではなく年で返しますが、時間ではありませんか? – quakkels
空の月を含めますか?私。 "5/2011(0)"のような行? – svick