【问题标题】:Hierarchy List<custom>, to return tracksHierarchy List<custom>,返回曲目
【发布时间】:2014-02-02 07:02:26
【问题描述】:

这可能只是一些逻辑问题.. 或我的设计问题 目前在跟踪功能以跟踪层次结构时遇到障碍

我有一个自定义的团队类

  public class Team
    {
        public int PositionID;
        public int? LeaderId;
        public List<Team> Members = new List<Team>();
        public Team(int positionid, int? leaderid)
        {
            PositionID = positionid;
            LeaderId= leaderid;
        }
    } 

生成的数据以树的形式呈现 节点是一个列表

这是我获得直接领导的功能

public static Team GetChildNode(List<Team> nodes, int seekId)
{
    Team found = null;
    //store leaders of leader that lead to the seek leader.
    List<Team> Leaders= new List<Team>();

    foreach (Team node in nodes)
    {
        if (found == null)
        {
            if (node.PositionID == seekId)
            {
                found = node;
                return found;
            }
            else
            {
                if (node.Members.Count > 0)
                {
                    return GetChildNode(node.Members, seekId);
                }
            }
        } 
    }
    return found;
 }

目前回报会根据数据给我一个有或没有成员的团队。

在调试时我注意到上面的这个逻辑我似乎正在命中

                    return GetChildNode(node.Members, seekId);

即使在找到节点之后..

我想跟踪导航..

这个函数的另一个词是让我成为直接领导者。

我想让直接领导>领导>领导>直到主要领导(领导没有领导)

我不介意返回一个列表,其中列表最小索引 0 是主要领导者,最大索引是直接领导者

【问题讨论】:

    标签: c# asp.net-mvc algorithm design-patterns entity-framework-4


    【解决方案1】:

    我建议为 IEnumarable 编写扩展类。

    static class EnumerableExtension
    {
        public static IEnumerable<IEnumerable<TSt>> FindNodes<T,TSt>(this IEnumerable<T> source, Func<T, IEnumerable<T>> childrenSelector, Func<T,TSt> resultSelector, Func<T, bool> predicate)
        {
            var result = new List<List<TSt>>();
    
            Action<T, List<TSt>> search = null;
            search = (element, resultStruct) =>
                {
                    resultStruct.Add(resultSelector(element));
                    if (predicate(element))
                    {
                        result.Add(resultStruct);
                    }
                    else
                    {
                        foreach (var item in childrenSelector(element))
                        {                            
                            search(item,new List<TSt>(resultStruct));
                        }
                    }
                };
            foreach (var v in source)
            {
                search(v, new List<TSt>());
            }
    
            return result;
        }
    }
    

    第一个参数是团队的源列表,第二个 - 是您类型的子节点的选择器,第三个 - 结果选择器(您要从对象中选择的内容,例如liderId),第四个 - 过滤条件(liderId for例子)。 它足够通用,您可以为不同的方法包装函数。 用法: 将返回 leaderId 列表并导航到 leaderId 等于 100 的团队

    teams.FindNodes(children => children.Members, res => res.LeaderId, con => con.LeaderId == 100);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多