.OrderBy与.GroupBy

时间:2019-03-18 19:26:04

标签: c# .net linq

我正在开发一个应用程序,该应用程序具有一个应该按状态分组的设施的下拉列表,并在状态分组中按设施的名称按字母顺序排序,然后还要按字母顺序对状态组进行排序。数据的初始列表是这样构建的:

_pageFacilityData.Add(new FacilityDTO {
    ClientID = (long) fds.ClientId,
    FacilityID = fds.FacilityId,
    Name = fds.Name,
    State = fds.State
});

当前的LINQ语句(不会按字母顺序对状态分组进行排序:

var groupedByState = _pageFacilityData.GroupBy(x => x.State).OrderBy(y => y.Key).ToList();

我一直在寻找解决方案,但是找不到能够满足我需要的答案。另外,为澄清起见,此代码是由其他人编写的。我仍然不确定100%y.Key值来自何处或如何设置。

为进一步澄清,数据在.cshtml视图中使用,如下所示:

@foreach (var state in ViewBag.FacilityDTOs) {
    <optgroup id=@state label=@state>
        @foreach (var facility in state) {
            <option id="c @facility.FacilityID" value="@facility.FacilityID">@facility.Name</option>
        }
    </optgroup>
}

2 个答案:

答案 0 :(得分:0)

您可以在分组时对列表进行排序:

var groupedByState = _pageFacilityData
    .GroupBy(
        x => x.State,
        x=>x,
        (k,v)=>new KeyValuePair<string,List<FacilityDTO>>(k, v.OrderBy(y=>y.Name).ToList()))
    .OrderBy(y => y.Key)
    .ToList();

编辑:在cshtml中尝试以下操作:

@foreach (KeyValuePair<string,List<FacilityDTO>> state in ViewBag.FacilityDTOs) {
    <optgroup id=@state.Key label=@state.Key>
        @foreach (var facility in state.Value) {
            <option id="c @facility.FacilityID" value="@facility.FacilityID">@facility.Name</option>
        }
    </optgroup>
}

答案 1 :(得分:0)

这应该给您您想要的东西:

var groupedByState = _pageFacilityData.OrderBy(x => x.State).GroupBy(x => x.State).Select(g => g.OrderBy(grp => grp.Name));

这是一个基于我可以从您的PageFacilityDTO类中收集的内容的演示:

https://dotnetfiddle.net/kChCiu

这是返回结果的屏幕截图:

enter image description here