Question

Je construis un système de commentaires filetés pour un de mes sites Web et je rencontre un problème ...

J'ai une liste PULLED FROM A DATABASE contenant un champ ID et un champ ID Parent. Le champ ID parent peut être null, mais le champ ID ne sera JAMAIS null.

Etant donné que ce sera un système de commentaires threadé, j’organise la liste de façon à ce que l’ID soit l’ID supérieur, mais si un ID parent existe, il sera inséré sous cet ID. Ensuite, cela peut continuer à l'infini aussi. Le deuxième niveau a donc également un identifiant et je souhaite insérer tout élément comportant un identifiant parent de cet identifiant.

Par exemple:

--- 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

Je pense que vous avez compris.

Alors voici ce que j'ai jusqu'à présent ...

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]);
            }
        }
    }

Il semble que le problème soit réglé à moitié, mais pas vraiment ... Le ThreadID indique bien à quel point il est planté à droite.

Était-ce utile?

La solution 2

Merci à tous pour votre aide, les gars. Je l'apprécie.

Cependant, j'ai trouvé quelque chose d'un gars qui a absolument tout écrit pour cela.

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

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

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

Autres conseils

Etant donné que vous utilisez la méthode d'extension Count () au lieu de la propriété Count (ce qui constitue une légère inefficacité; il est préférable de commencer par foreach), vous utilisez probablement .NET 3.5.

Je ne pense pas comprendre parfaitement votre schéma. Par exemple, qu'y a-t-il à dire que le commentaire avec threadID = 4 dans votre diagramme passe sous le premier élément threadID = 3 au lieu du deuxième?

Sans en savoir beaucoup sur les détails de ce que vous recherchez, en général, je considérerais une structure de données commentant avec:

  • CommentID: l'ID de cette entité
  • RootID: l'ID de l'élément racine du thread (vous pourrez ainsi extraire facilement tous les commentaires d'un thread)
  • ParentID: l'ID de commentaire du parent pour ce commentaire ou null s'il s'agit de l'élément racine
  • Horodatage: Ou quelque chose d'autre qui permettrait de trier correctement les commentaires enfants d'un parent.

Cela étant, il serait assez facile de déterminer le niveau d'indentation, si c'est ce qui vous préoccupe. Si cela vous semble utile, je peux vous donner plus de détails. Sinon, veuillez clarifier la question.

Vous avez besoin d’une fonction récursive et, en fonction de votre apparence dans la liste, il serait probablement préférable de stocker ID et ChildID (plutôt que parent). De cette façon, la fonction récursive peut mettre fin à une traversée lorsque ChildID == null.

Cela pourrait fonctionner:

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();
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top