Pergunta

Im construção de um Threaded sistema de comentários para um site da mina e eu corri para um problema ...

Eu tenho uma lista retirado de um banco de dados que tem um campo de ID e um pai ID campo. O campo ID pai pode ser nulo, mas o campo ID nunca será nulo.

Uma vez que este será um comentário sistema de rosca, eu organizar a lista para onde o ID é o de cima, mas se existir um ID pai, então ele seria inserido sob a ID. Então isso pode continuar por infinito também. Assim, o segundo nível agora também tem um ID e e eu quero inserir qualquer item com um ID pai desse ID sob ele.

Por exemplo:

--- 1. Blah

-------- 2. Blah Blah -> ParentID = 1

----------- 3. Blah Blah -> parentID = 2

-------------- 4. Blah Blah -> parentID = 3

----------- 3.Blah Blah -> parentID = 2

-------- 2. Blah Blah -> parentID = 1

Eu acho que você começa o ponto.

Então aqui é o que eu tenho até agora ...

List<comment> finalList = new List<comment>();
    for (int i = 0; i < getComments.Count(); i++)
    {
        string item = getComments[i].parentComment;
        getComments[i].threadID = 1;
        finalList.Add(getComments[i]);
        for (int ii = 0; ii < getComments.Count(); ii++)
        {
            if (getComments[ii].commentID == item)
            {
                getComments[ii].threadID = 2;
                finalList.Add(getComments[i]);
            }
        }
    }

Parece para classificá-lo no meio do caminho, mas não verdadeiramente ... O tópico é claro o quão longe ele fica plantada para a direita.

Foi útil?

Solução 2

Obrigado a todos pela vossa ajuda caras. Eu aprecio isso.

Eu fiz no entanto, encontrar algo por um cara que escreveu absolutamente tudo para ele.

http://www.scip.be/index.php?Page=ArticlesNET23

http://www.scip.be/index.php?Page=ArticlesNET09

http://www.scip.be/index.php?Page=ArticlesNET18

Outras dicas

Uma vez que você estiver usando o método Count () extensão em vez da propriedade Count. (Que é uma ligeira ineficiência em si, usando foreach seria melhor começar com embora) que você está usando presumivelmente NET 3.5

Eu não acho que eu entender completamente seu esquema - por exemplo, o que há para dizer que o comentário com threadID = 4 no diagrama passa sob o primeiro elemento threadID = 3 em vez do segundo

?

Sem saber muito na forma de detalhes do que você está depois, em geral, eu consideraria uma estrutura de dados comentando com:

  • CommentID: o ID desta entidade
  • RootID: a identificação do elemento raiz para o segmento (assim você pode buscar todos os comentários para um fio facilmente)
  • ParentID: o CommentID do pai para este comentário, ou nulo, se ele é o elemento raiz
  • Timestamp:. Ou outra coisa que permitiria a criança observações no prazo de um pai para ser resolvido adequadamente

Tendo em conta que, seria bastante fácil de trabalhar para fora o nível de recuo, se é isso que você está preocupado. Se isso soa útil, eu posso entrar em mais detalhes -. Se não, por favor, esclarecer a questão

Você precisa de uma função recursiva, e, com base em como parece que você está percorrendo a lista, provavelmente seria melhor ID loja e ChildID (em vez de ID pai). Desta forma, a função recursiva pode terminar um percurso quando ChildID == null.

Este trabalho poder:

class Program
    {
        static void Main(string[] args)
        {
            CommentCollection collection=new CommentCollection();
            Comment c1=new Comment("Blah",1,0,collection);
            Comment c2=new Comment("Blah blah",2,1,collection);
            Comment c3=new Comment("Blah blah", 3, 2, collection);
            Console.WriteLine(collection);
        }
    }
    [DebuggerDisplay("{id}-{parentId}: {text}")]
    class Comment:IEnumerable<Comment>
    {
        private readonly CommentCollection collection;
        private readonly int parentId;

        public Comment(string text, int id, int parentId, CommentCollection collection)
        {
            Id = id;
            this.parentId = parentId;
            collection.Add(this);
            this.collection = collection;
            this.text = text;
        }
        public Comment Parent
        {
            get
            {
                if (parent == null)
                {
                    parent = parentId == 0 ? null : collection[parentId];
                }
                return parent;
            }
        }

        private Comment parent;
        private readonly string text;
        public int Id{ get; private set;}
        public IEnumerator<Comment> GetEnumerator()
        {
            return collection.Where(c => c.Parent == this).GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
        public int Level
        {
            get { return Parent == null ? 0 : Parent.Level + 1; }
        }
        public override string ToString()
        {
            return Parent == null ? text : Parent + " > " + text;
        }
        public string ToString(bool tree)
        {
            if (!tree)
            {
                return ToString();
            }
            else
            {
                StringBuilder output = new StringBuilder();
                output.AppendLine(new string(' ', Level) + ToString(false));
                foreach (Comment comment in this)
                {
                    output.AppendLine(comment.ToString(true));
                }
                return output.ToString();
            }
        }
    }
    class CommentCollection:IEnumerable<Comment>
    {
        public void Add(Comment comment)
        {
            comments.Add(comment.Id,comment);
        }
        public Comment this[int id]
        {
            get { return comments[id]; }
        }
        private readonly Dictionary<int,Comment> comments=new Dictionary<int, Comment>();

        public IEnumerator<Comment> GetEnumerator()
        {
            return comments.Select(p => p.Value).GetEnumerator();
        }

        public IEnumerable<Comment> GetTopLevel()
        {
            return comments.Where(c => c.Value.Parent == null).
                Select(c => c.Value);
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
        public override string ToString()
        {
            StringBuilder output=new StringBuilder();
            foreach (Comment comment in GetTopLevel())
            {
                output.AppendLine(comment.ToString(true));
            }
            return output.ToString();
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top