65.9K
CodeProject 正在变化。 阅读更多。
Home

一个简单的通用 TreeList

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2012年3月18日

CPOL
viewsIcon

13764

downloadIcon

188

这是“一个简单的通用 TreeList”的替代方案。

介绍 

这个技巧展示了一种根据对象的一个(或多个)属性来组织数据成树形列表的方法。

在这个例子中,我将展示如何将一个人员列表转换为一个基于其主管的层级树形列表,以及另一个基于其客户的树形列表。

您可以在源代码中找到控制台应用程序和 Web 应用程序的更多示例。 

使用代码

数据: 

private static IEnumerable<Person> getPersons() {
    var eric = new Person { ID = 1, Name = "Eric", Supervisor = null, 
        ClientIDs = new int[] { 2 } };
    var stephanie = new Person { ID = 2, Name = "Stephanie", Supervisor = null, 
        ClientIDs = new int[] { 5 } };
    var caroline = new Person { ID = 3, Name = "Caroline", Supervisor = eric, 
        ClientIDs = new int[] { 4, 5 } };
    var ridge = new Person { ID = 4, Name = "Ridge", Supervisor = stephanie, 
        ClientIDs = new int[] { 5 } };
    var brooke = new Person { ID = 5, Name = "Brooke", Supervisor = eric, 
        ClientIDs = new int[] { 6, 7 } };
    var taylor = new Person { ID = 6, Name = "Taylor", Supervisor = ridge, 
        ClientIDs = new int[] { 8 } };
    var thorne = new Person { ID = 7, Name = "Thorne", Supervisor = brooke };
    var macy = new Person { ID = 8, Name = "Macy", Supervisor = ridge };
    return new List<Person> { eric, stephanie, caroline, ridge, brooke, taylor, thorne, macy };
}

单个父级(主管)

var persons = getPersons();
var treeBySupervisor = persons.ToTreeList(
    p => p.ID, //Primary key
    p => p.Supervisor //Foreign key
);

多个父级(客户)

var persons = getPersons();
var treeByClients = persons.ToTreeList(
    s => s.ID, //Primary key
    s => s.ClientIDs //Foreign keys
);

扩展

//TreeNode extensions
public static TreeNode<T> GetRoot<T>(this TreeNode<T> item)
public static IEnumerable<TreeNode<T>> GetAncestors<T>(this TreeNode<T> item)
public static IEnumerable<TreeNode<T>> GetChildren<T>(this TreeNode<T> item)
public static IEnumerable<TreeNode<T>> GetOffspring<T>(this TreeNode<T> item)
public static IEnumerable<TreeNode<T>> GetBrothers<T>(this TreeNode<T> item)
public static IEnumerable<TreeNode<T>> GetUncles<T>(this TreeNode<T> item)
public static IEnumerable<TreeNode<T>> GetNephews<T>(this TreeNode<T> item)

//TreeList extensions
public static IEnumerable<TreeNode<T>> GetSelf<T>(
       this IEnumerable<TreeNode<T>> collection, IEnumerable<T> selectedItems)
public static IEnumerable<TreeNode<T>> GetSelf<T>(this IEnumerable<TreeNode<T>> collection, T item)
public static IEnumerable<TreeNode<T>> GetParents<T>(this IEnumerable<TreeNode<T>> collection)
public static IEnumerable<TreeNode<T>> GetAncestors<T>(this IEnumerable<TreeNode<T>> collection)
public static IEnumerable<TreeNode<T>> GetRoots<T>(this IEnumerable<TreeNode<T>> collection)
public static IEnumerable<TreeNode<T>> GetChildren<T>(this IEnumerable<TreeNode<T>> collection)
public static IEnumerable<TreeNode<T>> GetOffspring<T>(this IEnumerable<TreeNode<T>> collection)
public static IEnumerable<TreeNode<T>> GetBrothers<T>(this IEnumerable<TreeNode<T>> collection)
public static IEnumerable<TreeNode<T>> GetUncles<T>(
       this IEnumerable<TreeNode<T>> collection)
© . All rights reserved.