首页 > 解决方案 > 确定列表中对象层次结构中相对位置的有效方法

问题描述

我有一个从 XML 文件生成的简单对象层次结构,如下所示:

interface IMyObject
{
  IList<IMyObject> Children {get;}
}

以 XML 表示,它看起来像这样。我添加了一个 ID 属性只是为了让您了解对象的“索引”是什么,它实际上并不存在于源数据中。

<MyObject ID="1">
    <Children>
        <MyObject ID="2">
            <Children>
                <MyObject ID="3" />
                <MyObject ID="4" />
            </Children>
        </MyObject>
        <MyObject ID="5">
            <Children>
                <MyObject ID="6" />
                <MyObject ID="7" />
            </Children>
        </MyObject>
        <MyObject ID="8" />
    </Children>
</MyObject>

现在我需要从层次结构中检查 n 个这样的对象的相对顺序,即我有三个对象,需要检查哪个是第一个,第二个和第三个(使用深度优先遍历)

我的想法是展平列表并获取每个对象的索引并比较它们,这完全符合我的要求:

public IList<IMyObject> GetFlattenedControlHierarchy()
{
    IList<IMyObject> Find(IEnumerable<IMyObject> controls)
    {
        return controls.Select(childControl =>
            {
                var currentLevel = new List<IMyObject>
                {
                    childControl
                };

                return currentLevel.Concat(Find(childControl.IMyObject));
            }
        ).SelectMany(c => c).ToList();
    }
    return Find(new[] { this });
}

然而,这让我觉得效率低下,因为如果我只想要单个控件的索引,我必须迭代整个图。yield return需要一个按定义无序的 IEnumerable,所以我不能在这里使用它。有没有办法让它短路或提高效率?层次结构相对较小,通常总共最多 100 个元素,但可能永远不会超过 300 个左右。

标签: c#

解决方案


推荐阅读