Я пытаюсь отсортировать список элементов в соответствии со следующими (упрощенными) правилами:
У каждого предмета есть следующие свойства:
Id (int),
ParentId (int?),
Name (string)
ParentID является самостоятельным присоединением ForeignKey к Id. Если у элемента есть 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
Тогда я бы хотел, чтобы они были отсортированы следующим образом:
Идентификаторы: 2, 21, 22, 1, 12, 11
На данный момент лучшее, что я могу придумать, - это сначала отсортировать по имени, а затем сгруппировать по 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>
так что это не работает.
Я чувствую, что есть более простой и лаконичный способ достижения этого, но в настоящее время он ускользает от меня - кто-нибудь может помочь?