C# 使用Linq在树状结构中遍历

C# 使用Linq在树状结构中遍历,c#,linq,c#-4.0,extension-methods,C#,Linq,C# 4.0,Extension Methods,我有一个物体的结构如下: public class CustomObject { public int CustomProperty{get;set;} public string CustomStringProperty{get;set;} public List<CustomObject> CustomObjects{get;set;} } 公共类CustomObject { 公共int自定义属性{get;

我有一个物体的结构如下:

    public class CustomObject
    {
        public int CustomProperty{get;set;}
        public string CustomStringProperty{get;set;}
        public List<CustomObject> CustomObjects{get;set;}
    }
公共类CustomObject
{
公共int自定义属性{get;set;}
公共字符串CustomStringProperty{get;set;}
公共列表自定义对象{get;set;}
}
我知道有很多方法可以提取任何对象,它的父对象,或者根据CustomProperty上的某些条件获取对象

我想编写一些扩展方法或linq,以便客户端可以访问每个对象及其属性

当前客户端有list-->
list()


例如,
ClientMethod(列出customObjs)

假设您希望能够遍历列表中的项及其所有子项

与往常一样,对于这些问题,我建议您从以下位置获取高效的通用树预序遍历方法:

公共静态部分类树帮助器
{
公共静态IEnumerable扩展(此IEnumerable源,Func elementSelector)
{
var stack=新堆栈();
var e=source.GetEnumerator();
尝试
{
while(true)
{
while(如MoveNext())
{
var项目=e.当前;
收益回报项目;
变量元素=元素选择器(项目);
如果(elements==null)继续;
栈推(e);
e=elements.GetEnumerator();
}
如果(stack.Count==0)中断;
e、 处置();
e=stack.Pop();
}
}
最后
{
e、 处置();
而(stack.Count!=0)stack.Pop().Dispose();
}
}
}
并根据您的需要使用它(如果您不喜欢,可以使用其他名称):

部分类树帮助器
{
公共静态IEnumerable扩展(此IEnumerable源)
{
返回source.Expand(item=>item.CustomObjects!=null&&item.CustomObjects.Count>0?item.CustomObjects:null);
}
}
然后,您可以简单地使用:

void ClientMethod(List<CustomObject> customObjs)
{
    foreach (var item in customObjs.Expand())
    {
        // do something
    }
}
void ClientMethod(列出customObjs)
{
foreach(customObjs.Expand()中的变量项)
{
//做点什么
}
}

或者像
customObjs.Expand().Where(…)
等LINQ查询。

我不确定您在找什么,但我有一个猜测。试试这个索引器:不是对你的问题的直接回答,但是你可以看看这是非常好的谢谢。有没有办法在CustomObject中设置一个属性,该属性的值告诉给定CustomObjects在“树状分支”中的嵌套级别?@Kynao包含用于提供级别的更新。是的,在这段时间内,我看到了另一个线程,在最后一个小时阅读并尝试理解它,或者至少在这里集成它,但我没有实现它。你会有和我们上面看到的一样简单的3块代码吗?即使是初学者liek me也会设法使用这些块。
partial class TreeHelper
{
    public static IEnumerable<CustomObject> Expand(this IEnumerable<CustomObject> source)
    {
        return source.Expand(item => item.CustomObjects != null && item.CustomObjects.Count > 0 ? item.CustomObjects : null);
    }
}
void ClientMethod(List<CustomObject> customObjs)
{
    foreach (var item in customObjs.Expand())
    {
        // do something
    }
}