我正在为我的网站建立一个线程评论系统,我遇到了一个问题......
我有一个从数据库中提取的列表,它有一个ID字段和一个父ID字段。父ID字段可以为null,但ID字段永远不会为空。
由于这将是一个线程评论系统,我将列表组织到ID是最顶层的位置,但是如果存在父ID,则它将被插入ID下。然后这也可以继续无限。所以第二级现在也有一个ID,我希望在其下插入任何具有该ID的父ID的项目。
例如:
--- 1。嗒嗒
-------- 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
我认为你明白了。
所以这就是我到目前为止......
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当然是向右种植的距离。
答案 0 :(得分:1)
鉴于你使用的是Count()扩展方法而不是Count属性(这本身就是一种轻微的低效率;尽管使用foreach会更好),你可能会使用.NET 3.5。
我认为我并不完全理解您的方案 - 例如,您的图表中threadID = 4的注释是否位于第一个threadID = 3元素而不是第二个?
在不了解您所追求的细节的方式上,一般情况下我会考虑使用以下评论数据结构:
考虑到这一点,如果这就是你所关注的,那么弄清楚缩进级别会相当容易。如果这听起来很有用,我可以进一步了解 - 如果没有,请澄清问题。
答案 1 :(得分:1)
感谢所有人的帮助。我很感激。
但我确实找到了一个能为它写下绝对所有内容的人。
http://www.scip.be/index.php?Page=ArticlesNET23
答案 2 :(得分:0)
您需要一个递归函数,并且根据您遍历列表的方式,最好存储ID和ChildID(而不是父ID)。这样,当ChildID == null时,递归函数可以结束遍历。
答案 3 :(得分: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();
}
}