Я пытаюсь сортировать список элементов в соответствии с следующими (упрощенными) правилами:
Я каждый элемент имеет следующие свойства:
Id (int),
ParentId (int?),
Name (string)
ParentId - это инострудник саморегулирования, чтобы идентифицировать. Если элемент имеет parentid, то родитель также будет существовать в списке.
Мне нужно сортировать список, чтобы все предметы, которые имеют родитель, появляются сразу после их родителя. Тогда все предметы будут отсортированы по имени.
Итак, если бы у меня было следующее:
Id: 1, ParentId: null, Name: Pi
Id: 2, ParentId: null, Name: Gamma
Id: 11, ParentId: 1, Name: Charlie
Id: 12, ParentId: 1, Name: Beta
Id: 21, ParentId: 2, Name: Alpha
Id: 22, ParentId: 2, Name: Omega
, то я хотел бы, чтобы они были сортированы следующим образом:
IDS: 2, 21, 22, 1, 12, 11
На данный момент лучшее, что я могу подняться Сначала сортирует по имени, а затем Group by parentid следующим образом:
var sortedItems = itemsToSort.OrderBy(x=> x.Name).GroupBy(x=> x.ParentId);
Мой стартовый план был затем следующим образом: (в неработающем коде)
var finalCollection = new List<Item>
var parentGroup = sortedItems.Where(si => si.Key == null);
foreach(parent in parentGroup)
{
finalCollection.Add(parent);
foreach(child in sortedItems.Where(si => si.Key == parent.Id)
{
finalCollection.Add(child);
}
}
Однако Parentgroup не является
IEnumerable<Item>
, поэтому это не работает.
Я чувствую, что есть проще, более лаконичный способ достижения этого, но в настоящее время он ускользнет - может кто-нибудь помочь?