2013-10-10 101 views
0

如果我有以下列表找对象以及所有子对象

List<FlatObject> objects = new List<FlatObject>(); 

objects.Add(new FlatObject { ID = 1, ParentID = 0, Name = "January", Amount = 1000 });   
objects.Add(new FlatObject { ID = 2, ParentID = 0, Name = "February", Amount = 2000 });   
objects.Add(new FlatObject { ID = 3, ParentID = 0, Name = "March", Amount = 3000 });  
objects.Add(new FlatObject { ID = 4, ParentID = 0, Name = "April", Amount = 4000 });  
objects.Add(new FlatObject { ID = 5, ParentID = 0, Name = "May", Amount = 5000 }); 
objects.Add(new FlatObject { ID = 6, ParentID = 1, Name = "June", Amount = 6000 }); 
objects.Add(new FlatObject { ID = 7, ParentID = 1, Name = "July", Amount = 7000 }); 
objects.Add(new FlatObject { ID = 8, ParentID = 1, Name = "August", Amount = 8000 }); 
objects.Add(new FlatObject { ID = 9, ParentID = 2, Name = "September", Amount = 9000 }); 
objects.Add(new FlatObject { ID = 10, ParentID = 2, Name = "October", Amount = 10000 }); 
objects.Add(new FlatObject { ID = 11, ParentID = 2, Name = "November", Amount = 11000 }); 
objects.Add(new FlatObject { ID = 12, ParentID = 10, Name = "December", Amount = 12000 }); 
objects.Add(new FlatObject { ID = 13, ParentID = 10, Name = "January", Amount = 13000 }); 
objects.Add(new FlatObject { ID = 14, ParentID = 10, Name = "February", Amount = 14000 }); 
objects.Add(new FlatObject { ID = 15, ParentID = 3, Name = "March", Amount = 15000 }); 
objects.Add(new FlatObject { ID = 16, ParentID = 3, Name = "April", Amount = 16000 }); 
objects.Add(new FlatObject { ID = 17, ParentID = 3, Name = "May", Amount = 17000 }); 

没有人知道我可以写一个返回一个对象的列表,它的所有孩子递归函数?

例如,如果我把ID = 2的参数,我想在一个列表背面

FlatObject { ID = 2, ParentID = 0, Name = "February", Amount = 2000 });  
FlatObject { ID = 9, ParentID = 2, Name = "September", Amount = 9000 }); 
FlatObject { ID = 10, ParentID = 2, Name = "October", Amount = 10000 }); 
FlatObject { ID = 11, ParentID = 2, Name = "November", Amount = 11000 }); 
FlatObject { ID = 12, ParentID = 10, Name = "December", Amount = 12000 }); 
FlatObject { ID = 13, ParentID = 10, Name = "January", Amount = 13000 }); 
FlatObject { ID = 14, ParentID = 10, Name = "February", Amount = 14000 }); 

;

我知道如何做到这一点使用LINQ如果我找回刚子,但如果我找回孩子和后代。

+0

我不明白2的id是如何带回这些结果的? –

+0

你听说过DFS? – wudzik

+0

@DeeMac 2是10父,10是13个 – Sico

回答

1

假设ID始终是唯一的,非零父ID总是有收集相应的对象,和所有根对象都有PARENTID为零你可以使应答对象是否具有一定ID的孩子或孙子从对象的扩展方法:

public static bool HasAncestor(this FlatObject obj, IEnumerable<FlatObject> objs, int id) 
{ 
    if (obj.ID == id) 
     return true; 
    if (obj.ParentID == 0) 
     return false; 
    return objs.Single(o => o.ID == obj.ParentID) // Get parent 
       .HasAncestor(objs, id);    // recurse 
} 

既然你也可以用它的其他方式,获取有一定的祖先中的所有对象

public static IEnumerable<FlatObject> GetAllChildren(this FlatObject obj, IEnumerable<FlatObject> objs) 
{ 
    return objs.Where(o => o.HasAncestor(objs, obj.ID)); 
} 
+0

感谢安德斯工作的对待父母 – Sico

1

您可以使用递归函数作为一个高层次如下,

private List<int> GetAllChildren(int parent) 
{ 
    List<T> children = new List<T>(); 
    PopulateChildren(parent.ID, children); 
    return children; 
} 

private void PopulateChildren(int parent, List<int> children) 
{ 

    //look up immediate childs and pass each child to recursice method and add child to list 
} 
0

这里是你的完整的解决方案(测试)。只需将FlatObjectExtention添加到您的解决方案。

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<FlatObject> objects = new List<FlatObject>(); 

     objects.Add(new FlatObject { ID = 1, ParentID = 0, Name = "January", Amount = 1000 }); 
     objects.Add(new FlatObject { ID = 2, ParentID = 0, Name = "February", Amount = 2000 }); 
     objects.Add(new FlatObject { ID = 3, ParentID = 0, Name = "March", Amount = 3000 }); 
     objects.Add(new FlatObject { ID = 4, ParentID = 0, Name = "April", Amount = 4000 }); 
     objects.Add(new FlatObject { ID = 5, ParentID = 0, Name = "May", Amount = 5000 }); 
     objects.Add(new FlatObject { ID = 6, ParentID = 1, Name = "June", Amount = 6000 }); 
     objects.Add(new FlatObject { ID = 7, ParentID = 1, Name = "July", Amount = 7000 }); 
     objects.Add(new FlatObject { ID = 8, ParentID = 1, Name = "August", Amount = 8000 }); 
     objects.Add(new FlatObject { ID = 9, ParentID = 2, Name = "September", Amount = 9000 }); 
     objects.Add(new FlatObject { ID = 10, ParentID = 2, Name = "October", Amount = 10000 }); 
     objects.Add(new FlatObject { ID = 11, ParentID = 2, Name = "November", Amount = 11000 }); 
     objects.Add(new FlatObject { ID = 12, ParentID = 10, Name = "December", Amount = 12000 }); 
     objects.Add(new FlatObject { ID = 13, ParentID = 10, Name = "January", Amount = 13000 }); 
     objects.Add(new FlatObject { ID = 14, ParentID = 10, Name = "February", Amount = 14000 }); 
     objects.Add(new FlatObject { ID = 15, ParentID = 3, Name = "March", Amount = 15000 }); 
     objects.Add(new FlatObject { ID = 16, ParentID = 3, Name = "April", Amount = 16000 }); 
     objects.Add(new FlatObject { ID = 17, ParentID = 3, Name = "May", Amount = 17000 }); 

     objects.First(x=>x.ID==2).GetAllChildren(objects).ToList().ForEach(Console.WriteLine); 

     Console.ReadKey(); 
    } 
} 

public class FlatObject 
{ 
    public int ID { get; set; } 
    public int ParentID { get; set; } 
    public string Name { get; set; } 
    public int Amount { get; set; } 

    public override string ToString() 
    { 
     return string.Format("ID={0} ParentID={1} Name={2} Amount={3} ", ID, ParentID, Name, Amount); 
    } 
} 

public static class FlatObjectExtention 
{ 
    public static IList<FlatObject> GetAllChildren(this FlatObject flatObject, IList<FlatObject> allItems) 
    { 
     var allChildren = new List<FlatObject>(); 
     var children = allItems.Where(x => x.ParentID == flatObject.ID).ToList(); 
     allChildren.AddRange(children); 

     foreach (var child in children) 
     { 
      allChildren.AddRange(child.GetAllChildren(allItems)); 
     } 
     return allChildren; 
    } 
} 
+0

另外,你可要知道[组合模式](http://en.wikipedia.org/wiki/Composite_pattern)这是这种场景的设计模式。 – mecek

相关问题