【问题标题】:How to loop parents before Child records in a nested collection?如何在嵌套集合中的子记录之前循环父母?
【发布时间】:2013-11-03 05:23:04
【问题描述】:

我有一个嵌套集合,我想在循环解析到嵌套集合之前遍历父集合中的每个元素,

到目前为止,我尝试过的是,

Private void Loop( PreviewObject  po ) 
{ 
             Console.Writeline(po.Name) ; 

            foreach (PreviewObject child in po.Childrens)
                Loop( child);
} 

PreviewObject 类

public class PreviewObject
    {
        private string _name;
        public string Name { get { return _name; } set { _name = value; } }

        private List<PreviewObject> _childrens = new List<PreviewObject>();
        public List<PreviewObject> Childrens
        {
            get { return _childrens; }
            set { _childrens = value; }
        }
    }

问题是循环是这样的

假设 X 是一个集合,并且 X 有元素 X ,这意味着一个嵌套集合

X 第一个元素是 A , X 第二个元素是 B, X的第一个元素的集合的第一个元素是C

如果我将此作为我的代码循环,我会得到以下结果,

一个 C X

我想得到的是,

一个
乙 C

A 和 B 都是父集合的元素 所以我想先循环遍历所有父元素,循环遍历元素内部的父元素集合

谁能帮我实现这个目标?

我尝试了以下代码,但它也给了我相同的结果

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections ; 

namespace Breadth_first_traversal
{
    class Program
    {
        public static void Main(string[] args)
        {
            list a  = new list();
            a.name = "A";

            list b = new list();
            b.name = "B";
            list c = new list();
            c.name = "C";
            list d = new list();
            d.name = "d";

            list parent = new list();
            parent.name = "Parent";

            parent.Childrens.Add(a);
            parent.Childrens.Add(b);

            a.Childrens.Add(c);
            b.Childrens.Add(d);

            Loop(a);

            Console.ReadKey();
        }
        private static  void Loop(list  po)
        {
            Queue<list> queue = new Queue<list>();
            queue.Enqueue(po);

            while (queue.Count != 0)
            {
                list  next = queue.Dequeue();
                foreach (list  obj in next.Childrens)
                    queue.Enqueue(obj);

                // Replace with the actual processing you need to do on the item
                Console.WriteLine(next.name);
            }
        }

        public class list
        {
            public string _name;
            public string name { get { return _name; } set { _name = value; } }  

            private List<list> childrens = new List<list>(); 
            public List<list> Childrens { get { return childrens ; }  set {childrens  = value ; }   } 
        } 
    } 
}

我通过上面的代码得到的结果是

一个 C

但我必须得到的是

一个 乙 C D

因为首先将父集合的所有元素写入控制台 然后将父集合元素的集合写入控制台

有人可以用一个很好的代码示例来回答吗?

【问题讨论】:

  • 我在您的代码中没有看到任何接受 2 个参数的循环
  • 我编辑了我的问题,它现在没有两个参数
  • 好的,首先Loop(db, child); 应该改为Loop(child);,除非您有尚未实施的计划
  • 问题不是参数,问题是在循环嵌套集合的元素之前循环遍历所有父元素的方法
  • 只是我之前发现的一个错误,这就是我把它放在 cmets 中的原因。

标签: c# .net loops foreach while-loop


【解决方案1】:

您要查找的内容称为广度优先遍历。您可以通过维护要访问的节点队列来实现它。将集合的根添加到队列中。现在,开始从队列中拉取项目。当您获得每个项目时,对其进行任何您想要的处理,然后将其所有子项添加到队列的末尾。继续从 Queue 中拉取节点并处理它们,直到 Queue 为空。

编辑:示例代码

private void Loop(PreviewObject po)
{
    Queue<PreviewObject> queue = new Queue<PreviewObject>();
    queue.Enqueue(po);

    while(queue.Count != 0)
    {
        PreviewObject next = queue.Dequeue();
        foreach(PreviewObject obj in next.Childrens)
            queue.Enqueue(obj);

        // Replace with the actual processing you need to do on the item
        Console.WriteLine(next.Name);
    }
}

【讨论】:

  • 我认为广度优先“搜索”是这种方法更常见的名称。维基百科很好地解释了它并且有一些伪代码en.wikipedia.org/wiki/Breadth-first_search
  • @noggin182 广度优先搜索是广度优先遍历的子集。虽然它可能是一个更常见的术语,但在这种情况下并不准确。
  • @Jon,抱歉我的评论有误。这不是他想做的事情的正确术语,但他可能会在谷歌搜索不正确的术语时获得更多帮助。
  • 这对我有帮助,谢谢你的朋友,你的代码示例非常有帮助:),我将你的答案标记为答案,并且已经投票了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多