1

私のウェブサイト用にスレッド化されたコメントシステムを構築していて、問題に遭遇しました...

ID フィールドと親 ID フィールドを持つリスト PULLED FROM A DATABASE があります。親 ID フィールドは null にすることができますが、ID フィールドが null になることはありません。

これはスレッド化されたコメント システムなので、ID が一番上になるようにリストを整理しますが、親 ID が存在する場合は ID の下に挿入されます。そして、これも無限に続くことができます。そのため、2 番目のレベルにも ID があり、その ID の親 ID を持つアイテムをその下に挿入したいと考えています。

例えば:

---1. 何とか

--------2. 何とか何とか-> ParentID=1

----------3. 何とか何とか->親ID = 2

-------------- 4. 何とか何とか ->parentID=3

----------- 3.何とか何とか -> 親 ID=2

--------2. 何とか何とか->親ID = 1

私はあなたがポイントを得ると思います。

だからここに私がこれまで持っているものがあります...

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

途中でソートされているように見えますが、実際にはそうではありません... ThreadID はもちろん、どれだけ右に植えられるかです。

4

4 に答える 4

1

助けてくれてありがとう。ありがたいです。

しかし、私はそれのために絶対にすべてを書いた人によって何かを見つけました。

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

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

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

于 2009-01-14T15:42:59.650 に答える
1

Count プロパティの代わりに Count() 拡張メソッドを使用していることを考えると (これ自体は少し非効率的ですが、最初は foreach を使用することをお勧めします)、.NET 3.5 を使用していると思われます。

私はあなたのスキームを完全には理解していないと思います-たとえば、図のスレッドID=4のコメントが2番目ではなく最初のスレッドID=3要素の下にあると言うのは何ですか?

あなたが求めているものの詳細についてあまり知らなくても、一般的に、次のようなコメントデータ構造を検討します。

  • CommentID: このエンティティの ID
  • RootID: スレッドのルート要素の ID (スレッドのすべてのコメントを簡単に取得できるようにするため)
  • ParentID: このコメントの親の CommentID、またはルート要素の場合は null
  • タイムスタンプ: または、1 つの親内の子コメントを適切に並べ替えることができるその他のもの。

それを考えると、インデント レベルが気になる場合は、かなり簡単にインデント レベルを計算できます。それが役立つと思われる場合は、さらに詳しく説明します。そうでない場合は、質問を明確にしてください。

于 2009-01-14T07:10:22.463 に答える
0

再帰関数が必要であり、リストをトラバースしているように見える方法に基づいて、(親 ID ではなく) ID と ChildID を保存する方がよいでしょう。このようにして、再帰関数は、ChildID == null の場合にトラバーサルを終了できます。

于 2009-01-14T05:46:31.993 に答える
0

これはうまくいくかもしれません:

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();
        }
    }
于 2009-01-14T12:40:50.407 に答える