C#递归方法创建树层次结构

巨人神

我创建了一个USB设备扫描器,该扫描器使用户可以查看树层次结构中的所有设备。首先,我很高兴它能正常工作,但是当我欣喜若狂后,我发现我的代码质量……不佳(请参见代码示例)。

为了更好地理解:这是树的外观以及代码的反馈。

BUS-Type              Device Description
----------            -------------------
----------
PCI      |            |USB-Controller
USB      |            |----|USB-Root Hub
USB      |            |----|-----|Generic USB Hub
USB      |            |----|-----|-----|USB Device
USB      |            |----|-----|Generic USB Hub
.                     .
.                     .
And so on.

现在是一个代码示例:

if (hierarchyDeviceZero.Children.Count != 0) {
    for (int usbHierarchyLevelOne = 0; usbHierarchyLevelOne < hierarchyDeviceZero.Children.Count; usbHierarchyLevelOne++) {
        foreach (var hierarchyDeviceOne in usbDeviceTree.USBDeviceNodes.Where(
            d1 => d1.HardwareID.Equals(hierarchyDeviceZero.Children[usbHierarchyLevelOne].HardwareID))
        ) {
            Console.WriteLine("{0}\t|\t\t|---|{1}", hierarchyDeviceOne.EnumeratorName, hierarchyDeviceOne.Description);
            if (hierarchyDeviceOne.Children.Count != 0) {
                for (int usbHierarchyLevelTwo = 0; usbHierarchyLevelTwo < hierarchyDeviceZero.Children.Count; usbHierarchyLevelTwo++) {
                    foreach (var hierarchyDeviceTwo in usbDeviceTree.USBDeviceNodes.Where(
                        d1 => d1.HardwareID.Equals(hierarchyDeviceOne.Children[usbHierarchyLevelTwo].HardwareID))
                    ) {
                        Console.WriteLine("{0}\t|\t\t    |---|{1}", hierarchyDeviceTwo.EnumeratorName, hierarchyDeviceTwo.Description);
                        if (hierarchyDeviceTwo.Children.Count != 0) {
                            for (int usbHierarchyLevelThree = 0; usbHierarchyLevelThree < hierarchyDeviceZero.Children.Count; usbHierarchyLevelThree++) {
                                foreach (var hierarchyDeviceThree in usbDeviceTree.USBDeviceNodes.Where(
                                    d1 => d1.HardwareID.Equals(hierarchyDeviceTwo.Children[usbHierarchyLevelThree].HardwareID))
                                ) {
.
.
.
.
And so on (until 10th Hierarchylevel).

我的问题是,如何将其放入递归方法中?我尝试了一些教程,但是我有点不理解一种方法如何在不覆盖其值的情况下调用其自身10次...我希望你们能理解我在试图实现的目标。

PS:对不起,我的英语不好。

马腾

在您的数据结构中,我看到了一些奇怪的地方,即您似乎拥有UsbDeviceTree所有节点,但是.Children在单个节点上也有一个属性。

除此之外,我认为如果可以仅使用.Children节点,则可以执行类似的操作

public class Device {
    public int HardwareId { get; set; }
    public Device[] Children {get; set; }
    /* ...the rest... */
}                               

void DisplayNodes(IEnumerable<Device> currentCollection, int indentation) {
    foreach (var currentNode in currentCollection) {
        // Display current node
        Console.WriteLine(
            ...
            display the node and
            use the indentation parameter to control the --- or ---|---
            ...
        );

        if (currentNode.Children != null) {
            DisplayNode(currentNode.Children, indentation + 1);
        }
    }
}

// Data
IEnumerable<Device> allDevices = usbDeviceTree.USBDeviceNodes;
IEnumerable<Device> rootDevices = allDevices
    .Where(x => x.IsRootNode /* TODO */)
    .ToArray();

// Display
DisplayNodes(rootDevices, 1);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中的递归循环在JSP页面中创建树结构

来自分类Dev

OutOfMemoryError递归创建树?

来自分类Dev

EF递归层次结构

来自分类Dev

在C#层次结构中使用不同的返回类型覆盖(阴影,重载?)方法

来自分类Dev

递归方法中的Stackoverflow创建层次结构

来自分类Dev

剑道:如何在TreeView中创建递归层次结构?

来自分类Dev

C#通过递归获取层次结构列表

来自分类Dev

C#继承层次结构中的对象创建

来自分类Dev

在复杂的层次结构上递归

来自分类Dev

从二维列表构建树层次结构

来自分类Dev

从图创建树形结构

来自分类Dev

在C中创建递归数据结构的方法

来自分类Dev

Java中的递归循环在JSP页面中创建树结构

来自分类Dev

树状视图(C#)中的层次结构

来自分类Dev

C#解析自定义层次结构表达式-构建树

来自分类Dev

没有递归的C#遍历层次结构

来自分类Dev

递归创建树

来自分类Dev

递归以获得完整的层次结构

来自分类Dev

剑道:如何在TreeView中创建递归层次结构?

来自分类Dev

C#分配-类层次结构

来自分类Dev

从递归列表创建树视图C#Asp.net

来自分类Dev

递归平均的层次结构

来自分类Dev

C#排序类型层次结构

来自分类Dev

SQL递归层次结构

来自分类Dev

在不使用类/对象的情况下递归创建树层次结构

来自分类Dev

JavaScript - 递归构建树数据结构

来自分类Dev

如何在 Haskell 中创建树层次结构?

来自分类Dev

从 {string : list} 对的平面字典创建层次结构的递归函数

来自分类Dev

从字符串数组递归创建树层次结构