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