C# 在层次结构列表中查找项目
在DirectoryItem类型的列表中查找和删除以下项的有效方法是什么-C# 在层次结构列表中查找项目,c#,algorithm,search,C#,Algorithm,Search,在DirectoryItem类型的列表中查找和删除以下项的有效方法是什么- List<DirectoryItem> lstRootDirectory = GetAllRootLevelDirectories(); List lstRootDirectory=GetAllRootLevelDirectories(); 每个DirectoryItem都有一个项(相同类型的列表-DirectoryItem),DirectoryItem是一个结构,如下所示: struct Directo
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);}
公共图书馆主任;
公共字符串名称;
公共清单项目;
}
在这种情况下,有什么更好的方法可以从这种层次结构列表中查找项目。您的数据结构实际上是一个有向树 任何算法都可以查找所有根目录,例如:
如果要查找嵌套的项,可以使用递归,如果要在项的名称后搜索,可以使用类似这样的方法
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好。