Комплексная сортировка LINQ с группами

Я пытаюсь сортировать список элементов в соответствии с следующими (упрощенными) правилами:

Я каждый элемент имеет следующие свойства:

 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> 

, поэтому это не работает.

Я чувствую, что есть проще, более лаконичный способ достижения этого, но в настоящее время он ускользнет - может кто-нибудь помочь?

5
задан BonyT 9 September 2011 в 10:19
поделиться