这个列表有更好的解决方案吗<;日期时间>;排序
本文关键字:lt 日期 时间 排序 gt 列表 更好 解决方案 | 更新日期: 2023-09-27 18:00:59
我正在为ASP.NET MVC菜单编写一个类。我希望能够获得所有博客条目的列表,并制作类似于以下的存档菜单:
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));
}
}
}
}
有没有更好的方法,也许用林克什么的?具体来说,我不喜欢的代码部分是:
if(!(dates[i].Month == dates[i + 1].Month && dates[i].Year == dates[i + 1].Year))
如果我能避免这样一个丑陋的If语句,那就太好了!
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();
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查询
- 按年和月对日期进行分组
- 选择每组的年、月和日期数
- 按年份和月份订购组
- 为每个组创建
ArchiveMenuItem
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));
我减去日期的天数(到月一(,这样我就可以用年和月来分组了。
@svick和@danyolgiax,
以下是我从dany的链接中想到的:
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));
}
}
}
沿着以下几条线应该可以工作:
menuItems.GroupBy(x => x.Month + "/" + x.Year);
我不知道持有DateTime的房产的名称,但它必须像一样设置
menuItems.GroupBy(x => x.(datetime).Month + "/" + x.(datetime).Year);