c# - 确定列表中对象层次结构中相对位置的有效方法
问题描述
我有一个从 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# - 如何在 Unity3D 单元测试中显示代码覆盖率?
- c++ - [aws-sdk-cpp][s3] 使用 getObject 下载二进制文件
- c# - 在第二个条目c#中使用第一个条目的ID
- sql - 设置 ON DELETE RESTRICT 时,SQLite 能够删除引用的行
- c++ - 如何修复 Mujoco CmakeLists 构建错误“/usr/bin/ld: 找不到 -lglfw”?
- css - 有没有办法将页脚按钮设置为白色
- java - 在与测试容器的集成测试中,您如何管理 EM 或 EMF?
- sql - 从三个表中选择数据,包括 null
- r - 在循环中连接字符串以生成一个字符串
- python - 使用具有相同 random_seed 的 CPU 和 GPU 的 CatBoost 回归时的不同指标得分