[英]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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.