2015-03-03 50 views
1

什麼是對類型DirectoryItem的列表,找到和項目的有效途徑 -查找某一項目

List<DirectoryItem> lstRootDirectory = GetAllRootLevelDirectories(); 

每個DirectoryItem有一個項目(同一類型 - DirectoryItem列表)和DirectoryItem是一個結構如下:

struct DirectoryItem 
     { 
      public string AbsolutePath { get { return string.Format("{0}/{1}", BaseUri, Name); } } 
      public bool IsDirectory; 
      public string Name; 
      public List<DirectoryItem> Items; 
     } 

在這種情況下,這將是更好的方法來從這種分層列表查找出的項目。

回答

1

你的數據結構實際上是一個有向樹。

任何tree-traversal算法將盡找到所有的根級目錄,如:

  1. 等級順序(BFS)
  2. 後訂單/預購(DFS的變種)
1

如果你想找到嵌套的物品,你可以使用遞歸,像這樣的東西,如果你正在搜索物品的名稱後

private void searchAll(DirectoryItem root, string name) 
{ 
    for (int a = 0; a < root.Items.Count; a++) 
    { 
     if (name == root.Items[a].Name) 
     { 
      // 
     } 
     searchAll(root.Items[a], name); 
    } 
} 
1

您也可以將樹結構壓扁成列表,然後使用Linq在列表上進行搜索。

創建一個擴展方法:

public static IEnumerable<T> Flatten<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> f) 
{ 
    return e.SelectMany(c => f(c).Flatten(f)).Concat(e); 
} 

使用擴展方法:

IEnumerable<DirectoryItem> allDirectories = lstRootDirectory.Flatten(d => d.Items).ToList(); 

現在執行LINQ在哪裏可以找到你的DirectoryItem。

+0

我已經在stackoverflow上搜索並尋找一個有效的方法。 http://stackoverflow.com/questions/11830174/how-to-flatten-tree-via-linq – 2015-03-03 09:15:06

+0

這只是一個更簡單的方法。您的其他選擇是根據數據的性質,您正在搜索的信息以及預期的結果數量,編寫遞歸方法,可以是「深度優先」或「寬度優先」,這可能更有效。 – 2015-03-03 09:24:31

+0

是的,正如阿米特所言,這些都是好的方法!順便說一下,目前,我有遞歸的方法看起來像_Vajura_,它似乎比** Linq **更好。 – 2015-03-03 09:33:08