2017-09-28 2 views
-1

Ich habe drei Listen. ID von LevelOne ist Eltern von LevelTwo und ID von LevelTwo ist Eltern von Level3.Drei verwandte Listen zu einer Struktur wie Struktur in C#

LevelOne 
{ 
    Level 
    { 
     Id = "ABC", 
     Desc = "Some desc" 
    }, 
    Level 
    { 
     Id = "DEF", 
     Desc = "Some desc" 
    }, 
    Level 
    { 
     Id = "PQR", 
     Desc = "Some desc" 
    }, 
    Level 
    { 
     Id = "XYZ", 
     Desc = "Some desc" 
    } 
} 

LevelTwo 
{ 
    Level 
    { 
     Id = "123A", 
     Parent = "ABC", 
     Desc = "Some Desc" 
    }, 
    Level 
    { 
     Id = "123B", 
     Parent = "ABC", 
     Desc = "Some Desc" 
    }, 
    Level 
    { 
     Id = "123C", 
     Parent = "PQR", 
     Desc = "Some Desc" 
    }, 
    Level 
    { 
     Id = "123D", 
     Parent = "XYZ", 
     Desc = "Some Desc" 
    } 
} 

LevelThree 
{ 
    Level 
    { 
     Id = "XYZ1", 
     Parent = "123A", 
     Desc = "Some Desc" 
    }, 
    Level 
    { 
     Id = "XYZ2", 
     Parent = "123A", 
     Desc = "Some Desc" 
    }, 
    Level 
    { 
     Id = "XYZ3", 
     Parent = "123B", 
     Desc = "Some Desc" 
    }, 
    Level 
    { 
     Id = "XYZ4", 
     Parent = "123D", 
     Desc = "Some Desc" 
    } 
} 

Ich versuche, diese drei Listen in einer Liste zu konsolidieren, die einen Baum wie Strukturen von LevelOne Ids haben wird.

public class AllLevels 
{ 
    public string Id {get;set;} 
    public string Desc {get;set;} 
    public bool HasChild {get;set;} 
    public IList<AllLevels> {get;set;} 
} 

Beispielausgabe so etwas wie dieses

AllLevels 
{ 
    Level 
    { 
     Id = "ABC", 
     Desc = "SomeDesc", 
     HasChildLevel = true, 
     childLevel = 
     { 
      Id = "123A", 
      Desc = "SomeDesc", 
      hasChildLevel = true, 
      ChildLevel = 
      { 
       Id = "XYZ1", 
       Desc = "Some Desc", 
       HasChildLevel = false 
      }, 
      ChildLevel = 
      { 
       Id = "XYZ2", 
       Desc = "Some Desc", 
       HasChildLevel = false 
      } 
     }, 
     childLevel = 
     { 
      Id = "123B", 
      Desc = "SomeDesc", 
      hasChildLevel = true, 
      ChildLevel = 
      { 
       Id = "XYZ3", 
       Desc = "Some Desc", 
       HasChildLevel = false 
      } 
     } 
    }, 
    Level 
    { 
     Id = "XYZ", 
     Desc = "Some Desc", 
     HasChildLevel = true 
     ChildLevel = 
     { 
      Id = "123D", 
      Desc = "Some Desc", 
      HasChild = true, 
      ChildLevel = 
      { 
       Id = "XYZ4", 
       Desc = "Some Desc", 
       HasChild = false 
      } 
     } 
    }, 
    Level 
    { 
     Id = "DEF", 
     Desc = "Some Desc", 
     HasChildLevel = false 
    } 
} 

Gibt es eine Möglichkeit durch LINQ würde ich diesen Prozess Schleifen ohne verschachtelte foreach tun kann? Ich habe viele Beiträge im Stackover-Fluss durchsucht, aber ich kann keine Technik finden, um drei verwandte Listen in einer Hierarchie zusammenzuführen. Wenn jemand einen Verweis auf die Website hat, wo ich eine Idee bekommen kann, die auch helfen würde.

+0

haben Sie sich 'SelectMany' angesehen? –

+0

Warum möchten Sie geschachtelte for-Schleifen vermeiden? U kann alle einmal durchlaufen, und alle ohne Eltern zu der ersten Liste hinzufügen, und dann Kind auf jeder Ebene hinzufügen über Rekursion mit IList.FindAll (x => x.Id == current.Parent. Dies ist nur ein Nudge in die richtige Richtung, Rekursion und Baumstrukturen sind Freunde :) –

Antwort

0

Wenn Sie nie mehr als drei Ebenen tief gehen, dann ist das unten eine relativ lesbare Lösung. Aber es ist keine generische Lösung für ein generisches Problem.

 var result = levelOne 
      .Select(l1 => new AllLevels 
      { 
       Id = l1.Id, 
       Desc = l1.Desc, 
       HasChild = levelTwo.Any(l2 => l2.Parent == l1.Id), 
       Children = levelTwo.Where(l2 => l2.Parent == l1.Id) 
       .Select(l2 => new AllLevels 
       { 
        Id = l2.Id, 
        Desc = l2.Desc, 
        HasChild = levelThree.Any(l3 => l3.Parent == l2.Id), 
        Children = levelThree.Where(l3 => l3.Parent == l2.Id) 
        .Select(l3 => new AllLevels 
        { 
         Id = l3.Id, 
         Desc = l3.Desc, 
         HasChild = false, 
         Children = new List<AllLevels>() 
        }) 
       }) 
      });