如何按属性排序列表并将HTML Razor中的元素分组?

时间:2015-05-28 04:10:51

标签: c# asp.net-mvc linq razor

也许这个问题很难解释,但这里是我面临的问题,我有一个模型属性列表

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语法,但我认为这不是最好的方法。

希望这个问题可以理解。

1 个答案:

答案 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添加到输出中仅用于演示 - 您可以在确认订单后将其删除。