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

C# Recursion Method to create a Tree Hierarchy

我创建了一个 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);