我正在开发一个应用程序,该应用程序具有一个应该按状态分组的设施的下拉列表,并在状态分组中按设施的名称按字母顺序排序,然后还要按字母顺序对状态组进行排序。数据的初始列表是这样构建的:
_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>
}
答案 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
这是返回结果的屏幕截图: