2015-03-03 51 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