コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
 /// <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));
 }