/// <summary> /// Retorna a lista de itens da chave informada. /// Considera o caminho da chave e os caminhos defaults. /// Por isso o retorno é uma coleção. /// </summary> /// <param name="chave"></param> /// <returns></returns> public List <U> ReceberItens(T[] chave, ArvoreNuloTipoEnum nuloTipo) { // Recebe os nós List <ArvoreNo <T, U> > nos = this.ReceberNos(chave, nuloTipo); // Transforma em uma lista de itens List <U> retorno = (from i in nos select i.Item).ToList(); // Retorna return(retorno); }
/// <summary> /// Método de pesquisa de nós usado na recursividade. /// Considera a chave informada e os caminhos defaults /// </summary> /// <param name="noBase"></param> /// <param name="chave"></param> /// <returns></returns> private List <ArvoreNo <T, U> > receberNosComDefault(ArvoreNo <T, U> noBase, T[] chave, ArvoreNuloTipoEnum nuloTipo) { // Retorno List <ArvoreNo <T, U> > retorno = new List <ArvoreNo <T, U> >(); // Se a chave não tem mais elementos, é este o elemento desejado if (chave.Length == 0) { retorno.Add(noBase); } // Verifica se o item da chave consta na colecao. // Utiliza os dois caminhos: o da chave e o default, caso existam else { // Se a chave não é nula, adiciona pelo caminho da chave if (chave[0] != null) { // Acha o comparador ArvoreComparadorEnum comparador = ArvoreComparadorEnum.Igual; if (this.Comparadores.Count >= noBase.Nivel + 1) { comparador = this.Comparadores[noBase.Nivel]; } // Adiciona o caminho do filho correspondente à chave if (comparador == ArvoreComparadorEnum.Igual && noBase.Filhos.ContainsKey(chave[0])) { // Adiciona o item exato retorno.AddRange( receberNosComDefault( noBase.Filhos[chave[0]], chave.Skip(1).ToArray(), nuloTipo)); } else if (comparador == ArvoreComparadorEnum.ComecaCom) { // Varre os nós filhos adicionando todos que iniciam com a string foreach (KeyValuePair <T, ArvoreNo <T, U> > item in noBase.Filhos) { if (chave[0].ToString().StartsWith(item.Value.Chave.ToString())) { retorno.AddRange( receberNosComDefault(item.Value, chave.Skip(1).ToArray(), nuloTipo)); } } } } else if (nuloTipo == ArvoreNuloTipoEnum.TratarNuloComoTodos) { // Adiciona os caminhos dos filhos foreach (KeyValuePair <T, ArvoreNo <T, U> > item in noBase.Filhos) { retorno.AddRange( receberNosComDefault( item.Value, chave.Skip(1).ToArray(), nuloTipo)); } } // Adiciona pelo caminho default if (noBase.Default != null) { retorno.AddRange( receberNosComDefault( noBase.Default, chave.Skip(1).ToArray(), nuloTipo)); } } // Retorna return(retorno); }
/// <summary> /// Navega na árvore retornando a lista de nós solicitada. /// Navega pelas chaves informadas e pelos defaults. /// </summary> /// <param name="chave"></param> /// <returns></returns> public List <ArvoreNo <T, U> > ReceberNos(T[] chave, ArvoreNuloTipoEnum nuloTipo) { // Navega para achar a lista de nos desejados return(receberNosComDefault(this.PrimeiroNo, chave, nuloTipo)); }