2016-04-01 28 views
1

aşağıda verildiği gibi ben Detail adında bir sınıf var: Aşağıda verilenYap ağaç yapısı

public class Detail 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public System.Nullable<int> ParentID { get; set; } 
} 

Ve detay bir listesini yapmak: şimdi

 List<Detail> Details= new List<Detail>(); 

     Details.Add(new Detail { Id = 1, Name = "James", ParentID =null }); 
     Details.Add(new Detail { Id = 2, Name = "David", ParentID = 1 }); 
     Details.Add(new Detail { Id = 3, Name = "Richard", ParentID = 2 }); 
     Details.Add(new Detail { Id = 4, Name = "John", ParentID = 3 }); 
     Details.Add(new Detail { Id = 5, Name = "Robert", ParentID = 3 }); 
     Details.Add(new Detail { Id = 6, Name = "Paul", ParentID = 3 }); 
     Details.Add(new Detail { Id = 7, Name = "Kevin", ParentID = 2 }); 
     Details.Add(new Detail { Id = 8, Name = "Jason", ParentID = 7 }); 
     Details.Add(new Detail { Id = 9, Name = "Mark", ParentID = 7 }); 
     Details.Add(new Detail { Id = 10, Name = "Thomas", ParentID = 9 }); 
     Details.Add(new Detail { Id = 11, Name = "Donald", ParentID = 9 }); 

Ve Bu Detay listesini ağaç yapısına dönüştürmek istiyorum.

+0

Pleas Ağaç yapısına daha spesifik olun, düğümlerin birbirine bağlı olduğunu nasıl hayal edersiniz? Bununla kastedilen hangi düğümün hangi düğüm ile bağlantılı olduğunu belirler? –

+0

@Remuze Düzenledim. Lütfen tekrar kontrol ediniz. Onun sadece bir detayı – devendra

+0

@Remuze ParentID, ana düğümü belirleyecektir. – devendra

cevap

3

Aşağıdaki

ağaç nesne tutacak yeni bir sınıf ekleme deneyebilirsiniz

public class TreeNode 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public TreeNode Parent { get; set; } 
    public List<TreeNode> Children{ get; set; } 
} 

Sonra nerede diyoruz

private static List<TreeNode> FillRecursive(List<Detail> flatObjects, int? parentId=null) 
{ 
    return flatObjects.Where(x => x.ParentID.Equals(parentId)).Select(item => new TreeNode 
    { 
    Name = item.Name, 
    Id = item.Id, 
    Children = FillRecursive(flatObjects, item.Id) 
    }).ToList(); 
} 

Sonra tree inşa etmek için bir özyinelemeli yöntemi ekleyin gerekiyor

var tree = FillRecursive(Details,null); 
+0

Sanırım "FillRecursive", "TreeNode.Parent" ayarlamıyorsa, TreeNode 'da "Ana" veya "Çocuklar" özelliğinin olması yeterli olduğunu söyleyebilirim. Ayrıca, "FillRecursive" geçersiz girişte sona ermiyor {id = 1, ParentId = 2}, {id = 2, ParentId = 1} ' – ironstone13

+0

@ ironstone13 daha iyi bir seçenek var mı? – devendra

+0

@devendra - Ana düğüme yapılan referansa (ağacın geçişini nasıl yapacaksınız) ve giriş listenizde tutarsız verilerin beklemesine gerek olup olmadığına bağlıdır. – ironstone13