从多级列表中的任何位置删除对象(绕过图算法搜索)
Remove an object from any place in a multilevel list ( Bypass searching on graph algorithm )
我有 : 项目列表。
此列表中的每个项目都可以有自己的具有相同结构的列表。
此列表的深度可以有条件地不受限制。
我需要:让项目 ID 列表删除任何项目,而不会浪费大量时间
我知道如何实现图搜索算法,我需要一个可以绕过简单枚举的解决方案。
项目结构看起来像这样,但它不是最终的,如果需要我可以更改它
public class NavigationPath
{
public int Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public List<NavigationPath> Childs { get; set; }
}
对于您给定的数据结构,以下方法是最快的。将它添加到您的 class NavigationPath
public void Remove(int id)
{
for (int i = 0; i < Childs.Count; i++)
{
if (Childs[i].Id == id)
{
Childs.RemoveAt(i);
i--;
}
else
{
Childs[i].Remove(id);
}
}
}
如果删除速度那么重要,那么另一个想法是使用 LinkedList<>
而不是 List<>
,因此
public LinkedList<NavigationPath> Childs { get; set; }
然后删除代码将是
public void Remove(int id)
{
var first = Childs.First;
while (first != null)
{
var next = first.Next;
if (first.Value.Id == id)
{
first.List.Remove(first);
}
else
{
first.Value.Remove(id);
}
first = next;
}
}
我有 : 项目列表。 此列表中的每个项目都可以有自己的具有相同结构的列表。 此列表的深度可以有条件地不受限制。
我需要:让项目 ID 列表删除任何项目,而不会浪费大量时间 我知道如何实现图搜索算法,我需要一个可以绕过简单枚举的解决方案。
项目结构看起来像这样,但它不是最终的,如果需要我可以更改它
public class NavigationPath
{
public int Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public List<NavigationPath> Childs { get; set; }
}
对于您给定的数据结构,以下方法是最快的。将它添加到您的 class NavigationPath
public void Remove(int id)
{
for (int i = 0; i < Childs.Count; i++)
{
if (Childs[i].Id == id)
{
Childs.RemoveAt(i);
i--;
}
else
{
Childs[i].Remove(id);
}
}
}
如果删除速度那么重要,那么另一个想法是使用 LinkedList<>
而不是 List<>
,因此
public LinkedList<NavigationPath> Childs { get; set; }
然后删除代码将是
public void Remove(int id)
{
var first = Childs.First;
while (first != null)
{
var next = first.Next;
if (first.Value.Id == id)
{
first.List.Remove(first);
}
else
{
first.Value.Remove(id);
}
first = next;
}
}