求一个算法,用来实现
  • 缩进效果,成功后扩展到javascript中
  • guoyun911 2010-09-21 03:43:43
    数据集合:

    id ParentId Name
    -----------------------------------------
    1 0 老总
    2 1 市场副总
    3 1 技术副总
    4 1 行政副总
    5 2 市场部
    6 4 财务部
    7 4 行政部
    8 3 C#技术部
    9 3 JAVA技术部
    10 9 J2EE技术部
    11 9 J2ME技术部
    ------------------------------------------

    说明:
    id: 是每个元素的标识
    ParentId: 父级元素标识
    Name: 部门名称

    求助:
    以上数据放入集合对象中,通过算法显示部门的树状结构:

    ---------------------------
    老总
    技术副总
    C#技术部
    JAVA技术部
    J2EE技术部
    J2ME技术部
    行政副总
    财务部
    行政部
    市场副总
    市场部
    ----------------------------


    紧急求助各位,谢谢帮忙,分没多少了,尽量给了!

    ...全文
    342 32 打赏 收藏 转发到动态 举报
    写回复
    用AI写文章
    32 条回复
    切换为时间正序
    请发表友善的回复…
    发表回复
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    谢谢。。。代码整理中……
    xzjxylophone 2010-09-25
    • 打赏
    • 举报
    回复
    关注中。。。。。。。
    symbol_bc 2010-09-25
    • 打赏
    • 举报
    回复

    这是一个匿名方法,其实和普通的循环一样,他完全等价于:

    for (int i = 0; i < this.departList.Count; i++)
    {
    Department p = this.GetParent(this.departList[i]);

    while (p != null)
    {
    this.departList[i].Depth++;
    p = this.GetParent(p);
    }
    }


    forreach就是for循环,我感觉,匿名方法优缺点都有,可以比较好的使用上下文变量,在写一些短小代码时不用没必要声明新方法。
    delegate (){}就是这样一样形式,2.0中已经可用,3.5中可用lambda表达式,更加优美。
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 20 楼 liue_0612 的回复:]
    delegate(){}
    表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
    [/Quote]

    这些资料我查过了。。。如果我明白你这句话是什么意思的话,我不会提出问题的。。。
    liue_0612 2010-09-25
    • 打赏
    • 举报
    回复
    delegate(){}
    表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 18 楼 symbol_bc 的回复:]
    你既然是3.5的话,运行应该没问题,而且你也应该可以看到结果了。
    其中一些linq和lambda的写法可能不兼容2.0,不过改起来也不难,你应该自己试试。
    要是扩展到js的话,其实你的意思应该是从后台获取一个数据源然后生成,添加节点都在js中做吧,
    虽然不算难,但是和c#中的代码可就不一样了,不过思想一样。
    你可以看看开源库中的js树。
    [/Quote]
    谢谢你的详细介绍,不过还有一个问题得请教你!


    this.departList.ForEach(delegate(Department t)
    {
    Department p = this.GetParent(t);

    while (p != null)
    {
    t.Depth++;
    p = this.GetParent(p);
    }

    });




    这段代码中的delegate,我不是很清楚delegate(){}这个东西怎么用,代表什么意思,能帮我解释一下么?谢谢!
    symbol_bc 2010-09-25
    • 打赏
    • 举报
    回复
    你既然是3.5的话,运行应该没问题,而且你也应该可以看到结果了。
    其中一些linq和lambda的写法可能不兼容2.0,不过改起来也不难,你应该自己试试。
    要是扩展到js的话,其实你的意思应该是从后台获取一个数据源然后生成,添加节点都在js中做吧,
    虽然不算难,但是和c#中的代码可就不一样了,不过思想一样。
    你可以看看开源库中的js树。
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 14 楼 symbol_bc 的回复:]
    这句话的意思是 取得当前节点的所有下一级子节点
    [/Quote]

    还有一点是,我最希望能在JAVASCRIPT里实现该功能,这段代码可以扩展到JS里么?
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 13 楼 symbol_bc 的回复:]
    你用的是vs2008还是2005呢?换句话说是framework 2.0 还是3.5呢?这是一个linq写法
    [/Quote]

    哦。。我明白点了,这句话长的很想SQL语句。。我目前用的是VS2008,也就是说,是framework3.5,但是希望代码兼容3.5和2.0,换一种写法是什么样的呢?谢谢你为我解答!
    whowhen21 2010-09-25
    • 打赏
    • 举报
    回复
    帮顶,6L代码不错哦!
    ***********************************************************
    欢迎使用CSDN 小秘书
    ***********************************************************
    symbol_bc 2010-09-25
    • 打赏
    • 举报
    回复
    这句话的意思是 取得当前节点的所有下一级子节点
    symbol_bc 2010-09-25
    • 打赏
    • 举报
    回复
    你用的是vs2008还是2005呢?换句话说是framework 2.0 还是3.5呢?这是一个linq写法
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 8 楼 symbol_bc 的回复:]
    C# code


    namespace Test
    {
    public partial class _Default : System.Web.UI.Page
    {

    protected void Page_Load(object sender, EventArgs e)
    {

    departList = new……
    [/Quote]

    请问一下。。

    var temp = from dept in departList
    where dept.ParentID = node.ID
    select dept;


    这句是什么意思?谢谢
    symbol_bc 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 30 楼 jianshao810 的回复:]
    这是linq语言。。
    意思是说
    departList 里面的对象中 如果 s.ID == t.ParentID 返回是true。那么就返回。。。
    s.ID == t.ParentID 这是一个委托。。
    [/Quote]

    这不是linq,是lambda表达式,我上边和你说过那个匿名方法的事,就是那个delete () {}那个,在3.5中匿名方法又有了新的表示方式,就是这个lambda表达式。
    他等价于

    private Department GetParent(Department t)
    {
    if (t == null)
    return null;
    return this.departList.Find(s => s.ID == t.ParentID);
    this.departList.Find(delete (Department s){
    return s.ID == p.ParentID;
    });
    }

    jianshao810 2010-09-25
    • 打赏
    • 举报
    回复
    http://blog.csdn.net/godpreserve/archive/2009/09/17/4563593.aspx
    可以看看这个。。
    jianshao810 2010-09-25
    • 打赏
    • 举报
    回复
    这是linq语言。。
    意思是说
    departList 里面的对象中 如果 s.ID == t.ParentID 返回是true。那么就返回。。。
    s.ID == t.ParentID 这是一个委托。。
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 28 楼 symbol_bc 的回复:]
    呵呵,那是因为我凑巧今天没啥事!!呵呵
    [/Quote]

    整理代码的过程中,又发现一个地方没见过

    private Department GetParent(Department t)
    {
    if (t == null)
    return null;
    return this.departList.Find(s => s.ID == t.ParentID);
    }



    那个s => s.ID ,=>是干嘛的呀?指针不是->么?不懂了。。请指教,不胜感激啊
    symbol_bc 2010-09-25
    • 打赏
    • 举报
    回复
    呵呵,那是因为我凑巧今天没啥事!!呵呵
    guoyun911 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 26 楼 symbol_bc 的回复:]
    引用 25 楼 guoyun911 的回复:
    引用 22 楼 symbol_bc 的回复:
    这是一个匿名方法,其实和普通的循环一样,他完全等价于:

    C# code

    for (int i = 0; i < this.departList.Count; i++)
    {
    Department p = this.GetParent(this.departList[i]);
    ……
    [/Quote]

    不好意思,我今天写代码写傻了!我找到问题了,继续整理Ing,谢谢回复,还有,我见你回复的很及时,请问你是用什么工具能够即时看到回帖信息?
    symbol_bc 2010-09-25
    • 打赏
    • 举报
    回复
    [Quote=引用 25 楼 guoyun911 的回复:]
    引用 22 楼 symbol_bc 的回复:
    这是一个匿名方法,其实和普通的循环一样,他完全等价于:

    C# code

    for (int i = 0; i < this.departList.Count; i++)
    {
    Department p = this.GetParent(this.departList[i]);

    ……


    这段代码没有递归啊!
    [/Quote]

    谁也没说这是递归啊!这是设置每个node节点的depth深度,递归在方法GenereateTree()中
    加载更多回复(12)

    111,129

    社区成员

    发帖
    与我相关
    我的任务
    社区描述
    .NET技术 C#
    社区管理员
    • C#
    • Creator Browser
    • by_封爱
    加入社区
    • 近7日
    • 近30日
    • 至今
    社区公告

    让您成为最强悍的C#开发者

    试试用AI创作助手写篇文章吧