C# 在层次结构列表中查找项目

C# 在层次结构列表中查找项目,c#,algorithm,search,C#,Algorithm,Search,在DirectoryItem类型的列表中查找和删除以下项的有效方法是什么- List<DirectoryItem> lstRootDirectory = GetAllRootLevelDirectories(); List lstRootDirectory=GetAllRootLevelDirectories(); 每个DirectoryItem都有一个项(相同类型的列表-DirectoryItem),DirectoryItem是一个结构,如下所示: struct Directo

在DirectoryItem类型的列表中查找和删除以下项的有效方法是什么-

List<DirectoryItem> lstRootDirectory = GetAllRootLevelDirectories();
List 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;  
        }
struct DirectoryItem
{
公共字符串绝对路径{get{return string.Format(“{0}/{1}”,BaseUri,Name);}
公共图书馆主任;
公共字符串名称;
公共清单项目;
}

在这种情况下,有什么更好的方法可以从这种层次结构列表中查找项目。

您的数据结构实际上是一个有向树

任何算法都可以查找所有根目录,例如:

  • 级别命令(BFS)
  • 后订单/预订单(DFS的变体)

  • 如果要查找嵌套的项,可以使用递归,如果要在项的名称后搜索,可以使用类似这样的方法

    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);
        }
    }
    
    private void searchAll(目录项根,字符串名)
    {
    对于(int a=0;a
    您还可以将树结构展平为一个列表,然后使用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();
    
    公共静态IEnumerable展平(此IEnumerable e,Func f)
    {
    返回e.SelectMany(c=>f(c).展平(f)).Concat(e);
    }
    
    使用扩展方法:

    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();
    
    IEnumerable allDirectories=lstRootDirectory.flant(d=>d.Items.ToList();
    

    现在执行LINQ何处可以找到您的DirectoryItem。

    我已经在stackoverflow上搜索过了,正在寻找一种有效的方法。这只是一个更简单的方法。您的另一个选择是编写一个递归方法,深度优先或广度优先,根据数据的性质、您正在搜索的信息和预期结果的数量,这可能更有效。是的,正如Amit所建议的那样,这些都是很好的方法!顺便说一句,目前,我有递归方法看起来像Vajura,它似乎比Linq好。