/// <summary>
        /// Genera un nivel de una rama del arbol de categorias.
        /// </summary>
        /// <param name="parent">Categoria padre del nivel.</param>
        /// <param name="categorias">Categorias sin insertar en el arbol.</param>
        private void BuildBranch(Categoria parent, Categoria[] categorias)
        {
            parent.Children = categorias.Where(x => x.PadreCategoriaId == parent.Id).ToArray();

            var childrenCatagorias = categorias.Where(x => x.PadreCategoriaId != parent.Id).ToArray();

            parent.Children.ForEach(x => BuildBranch(x, childrenCatagorias));
        }
 private void FillTree(TreeView treeView, Categoria[] tree)
 {
     tree.ForEach(x =>
     {
         var node = new TreeNode(x.Nombre) { Tag = x };
         treeView.Nodes.Add(node);
         FillNode(node, x.Children);
     });
 }
 private void FillNode(TreeNode parent, Categoria[] children)
 {
     children.ForEach(x =>
     {
         var node = new TreeNode(x.Nombre) { Tag = x };
         parent.Nodes.Add(node);
         FillNode(node, x.Children);
     });
 }
        /// <summary>
        /// Genera el primer nivel del arbol de categorias.
        /// </summary>
        /// <param name="categorias">Coleccion de categorias.</param>
        /// <returns>Coleccion de categorias con estructura de arbol.</returns>
        private Categoria[] BuildTree(Categoria[] categorias)
        {
            var categoriasRoot = categorias.Where(x => !x.PadreCategoriaId.HasValue).ToArray();

            var childrenCategorias = categorias.Where(x => x.PadreCategoriaId.HasValue).ToArray();

            categoriasRoot.ForEach(x => BuildBranch(x, childrenCategorias));

            return categoriasRoot;
        }
        private Categoria FindCategoria(Categoria[] categorias, int categoriaId)
        {
            foreach (var categoria in categorias)
            {
                if (categoriaId == categoria.Id)
                    return categoria;

                var child = FindCategoria(categoria.Children, categoriaId);
                if (child != null)
                    return child;
            }
            return null;
        }
        private string GetDescription(Categoria[] categorias, int categoriaId)
        {
            foreach (var categoria in categorias)
            {
                if (categoria.Id == categoriaId)
                    return categoria.Nombre;

                var description = GetDescription(categoria.Children, categoriaId);
                if (!String.IsNullOrEmpty(description))
                    return String.Concat(categoria.Nombre, "¦", description);
            }
            return null;
        }