也许这个问题很难解释,但这里是我面临的问题,我有一个模型属性列表
public class ViewModel
{
public int PropertyID {get;set;}
public DateTime Datefield {get;set}
public string OtherProperty {get;set;}
}
然后我用一些值填充列表:
List<ViewModel> listOfValues = new List<ViewModel>();
listOfValues.Add(new ViewModel{
PropertyID = 1,
Datefield = new DateTime(2010, 5,25, 12,00,00),
OtherProperty = "Name1"
});
想象一下,Datefield有这个值:
0: 25/05/2010 12:00:00
1: 25/05/2010 12:00:00
2: 26/05/2010 13:00:00
3: 26/05/2010 13:00:00
4: 26/05/2010 14:00:00
5: 27/05/2010 12:00:00
之后,我使用简单的listOfElements.OrderBy(o => o.Datefield).ThenBy(o => o.Datefield.Hour);
订购列表,以便按日期排序列表,并在最近一小时的日期之后订购。
一切正常,但一个要求是&#34; group&#34;按日期和小时排列的元素,但不是LINQ的GroupBy
,而是以这种方式使用RAZOR:
<div>
@Model.listOfElements[i].Datefield //0: 25/05/2010 12:00:00
@Model.listOfElements[i].Datefield //1: 25/05/2010 12:00:00
</div>
<div>
@Model.listOfElements[i].Datefield //2: 26/05/2010 13:00:00
@Model.listOfElements[i].Datefield //3: 26/05/2010 13:00:00
</div>
<div>
@Model.listOfElements[i].Datefield //4: 26/05/2010 14:00:00
</div>
<div>
@Model.listOfElements[i].Datefield //5: 27/05/2010 12:00:00
</div>
我想在html中按日期和小时对它们进行分组,所以匹配的是例如div,所以我可以给它们样式,使它们成为一个组。我尝试了一些丑陋的razor-html语法,但我认为这不是最好的方法。
希望这个问题可以理解。
答案 0 :(得分:5)
假设根据您的代码Model.listOfElements
包含IEnumerable<ViewModel>
,您可以使用Linq对日期进行分组,然后每个分组本身都包含该日期组中的项目列表。要获取仅限日期+小时分组,请在分组中使用匿名投影来仅考虑分组中的日期和小时
@foreach (var grp in Model.listOfElements
.OrderBy(m => m.PropertyID)
.GroupBy(m => string.Format("{0:yyyyMMddHH}", m.Datefield)))
{
<div>
@foreach (var itm in grp)
{
<p>@itm.PropertyID - @itm.Datefield</p>
}
</div>
}
PropertyID
上的预订将转到分组,以提供您已列出的订单。我已将PropertyId
添加到输出中仅用于演示 - 您可以在确认订单后将其删除。