Eu tenho uma árvore criada a partir desta classe.
class Node
{
public string Key { get; }
public List<Node> Children { get; }
}
Quero pesquisar em todas as crianças e em todos os seus filhos para encontrar aqueles que correspondem a uma condição:
node.Key == SomeSpecialKey
Como posso implementá-lo?
Respostas:
É um equívoco pensar que isso requer recursão. Ele vai exigir uma pilha ou uma fila ea maneira mais fácil é para implementá-lo usando recursão. Para ser mais completo, vou fornecer uma resposta não recursiva.
Use esta expressão por exemplo para usá-lo:
fonte
StackOverflowException
.Queue<Node>
(com as alterações correspondentes paraEnqueue
/Dequeue
dePush
/Pop
).Pesquisando uma árvore de objetos com o Linq
fonte
head
echildrenFunc
de dividir os métodos em duas partes, para que a verificação de parâmetro não seja adiada para o tempo de passagem.Se você deseja manter a sintaxe do Linq, você pode usar um método para obter todos os descendentes (filhos + filhos dos filhos etc.)
Este enumerável pode então ser consultado como qualquer outro usando where ou first ou o que quer que seja.
fonte
Você pode tentar este método de extensão para enumerar os nós da árvore:
Em seguida, use isso com uma
Where()
cláusula:fonte
Talvez você precise apenas
Ou, se você precisar pesquisar um nível mais profundo,
Se você precisar pesquisar em todos os níveis, faça o seguinte:
fonte
E então você pode pesquisar como:
fonte
Por que não usar um
IEnumerable<T>
método de extensãoentão apenas faça isso
fonte
Há algum tempo, escrevi um artigo de projeto de código que descreve como usar o Linq para consultar estruturas semelhantes a árvores:
http://www.codeproject.com/KB/linq/LinqToTree.aspx
Isso fornece uma API de estilo linq-to-XML onde você pode pesquisar descendentes, filhos, ancestrais etc ...
Provavelmente um exagero para o seu problema atual, mas pode ser do interesse de outras pessoas.
fonte
Você pode usar este método de extensão para consultar a árvore.
fonte
Eu tenho um método de extensão genérico que pode nivelar qualquer
IEnumerable<T>
e dessa coleção nivelada, você pode obter o nó que deseja.Use assim:
fonte
Eu uso as seguintes implementações para enumerar itens da Árvore
BreadthFirstUnfold na implementação acima usa a fila de sequências de nós em vez da fila de nós. Este não é o método clássico de algoritmo BFS.
fonte
E apenas por diversão (quase uma década depois), uma resposta também usando Genéricos, mas com um loop Stack e While, baseado na resposta aceita por @vidstige.
Dada uma coleção, pode-se usar assim
ou com um objeto raiz
fonte