Como construir um sistema de comentário de rosca em C #? Socorro
-
22-07-2019 - |
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.
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
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();
}
}