2016-04-25 4 views
0

Обычно мы конвертируем плоский список в иерархический список, но в моем случае я хочу преобразовать иерархический список в плоский список.Как преобразовать иерархический список в плоский список?

У меня есть иерархический list<T>, и я хочу преобразовать этот иерархический список в плоский класс list<T>.

Скажем, у меня есть ниже иерархический список

Parent1 
    --- Child1 ,F1 
    ----Child2, F2 
    ----Child2, F3 
Parent2 
    ----Child2,F2 
    ----Child4,F6 
    Parent3 
    --- Child1 ,F1 

Мне нужен выход, как показано ниже:

Parent1, Child1,F1 
Parent1, Child2,F2 
Parent1, Child2,F3 
Parent2,Child2,F2 
Parent2,Child4, F6 
Parent3, Child1,F1 
+0

Мы должны были бы увидеть реальную структуру класса, чтобы дать содержательный ответ, но я хотел бы попробовать использовать 'SelectMany' и вернуться, когда вы застряли. –

+1

Возможный дубликат [Как сгладить дерево через LINQ?] (Http://stackoverflow.com/questions/11830174/how-to-flatten-tree-via-linq) –

+0

Привет, Д. Стэнли, я только что привел приведенный выше пример для вашего понимания, у меня очень классная структура bis, которую я не могу обеспечить, beacz класс очень большой. как вы упомянули, используя selectmany, как я могу это сделать. Не могли бы вы привести пример кода. – user1818042

ответ

0

Это может быть не самым оптимальным решением (это может быть дополнительно минимизировано я думаю, и У меня более сжатая версия, но эта форма - это то, что я использую больше всего)

Это то, что я использовал

public static IEnumerable<T> FlattenHierarchy<T>(this T node, 
           Func<T, IEnumerable<T>> getChildEnumerator) 
{ 
    yield return node; 
    if (getChildEnumerator(node) != null) 
    { 
     foreach (var child in getChildEnumerator(node)) 
     { 
      foreach (var childOrDescendant 
         in child.FlattenHierarchy(getChildEnumerator)) 
      { 
       yield return childOrDescendant; 
      } 
     } 
    } 
} 

и вы можете использовать его как

folder.FlattenHierarchy(x => x.SubFolders) 
Смежные вопросы