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

时间:2015-02-02 15:55:40

标签: c# .net optimization recursion

我创建了一个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:抱歉我的英文不好。

1 个答案:

答案 0 :(得分:1)

在您的数据结构中,我看到了一些奇怪的东西,即您似乎有一个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);