Afficher le commentaire de manière nestede, comme le commentaire Gmail

J’ai un comments table, qui ressemble à ceci, ajouté du contenu de maquette aussi:

 +------------+---------+----------+-------------------+------------------------------------+---------------------------+ | comment_id | user_id | post_id | comment_parent_id | comment_content | comment_creation_datetime | +------------+---------+----------+-------------------+------------------------------------+---------------------------+ | 26 | 1 | 16329 | 0 | Första | 2016-01-24 10:42:49 | | 27 | 1 | 16329 | 26 | Svar till första | 2016-01-24 10:42:55 | | 28 | 1 | 16329 | 26 | Andra svar till förta | 2016-01-24 10:43:06 | | 29 | 1 | 16329 | 28 | Svar till "andra svar till första" | 2016-01-24 10:43:23 | +------------+---------+----------+-------------------+------------------------------------+---------------------------+ 

J’essaie d’afficher le style de commentaires Reddit, comme cette image:

entrez la description de l'image ici

Même si je ne comprends pas comment commencer par où commencer … j’ai essayé de chercher un article sur Google qui se rapportait à mon besoin mais je ne l’ai pas trouvé. Toute aide … je poste des images dans les commentaires ci-dessous parce que je n’ai pas de sharepoint réputation pour poster l’image merci

Disons que vous avez un commentaire de classe

 public class Comment { public int comment_id { get; set; } public int user_id { get; set; } public int post_id { get; set; } public int comment_parent_id { get; set; } public ssortingng comment_content { get; set; } public DateTime comment_creation_datetime { get; set; } public Comment(int comment_id, int user_id, int post_id, int comment_parent_id, ssortingng comment_content, DateTime comment_creation_datetime) { this.comment_id = comment_id; this.user_id = user_id; this.post_id = post_id; this.comment_parent_id = comment_parent_id; this.comment_content = comment_content; this.comment_creation_datetime = comment_creation_datetime; } public override ssortingng ToSsortingng() { return ssortingng.Format("{0} {1} {2}", this.comment_id, this.comment_content, this.comment_creation_datetime); } } 

rempli avec les exemples de valeurs suivants

 List cList = new List(); cList.Add(new Comment(26, 1, 16329, 0, "Första ", new DateTime(2016, 01, 24, 10, 42, 49))); cList.Add(new Comment(27, 1, 16329, 26, "Svar till första", new DateTime(2016, 01, 24, 10, 42, 55))); cList.Add(new Comment(28, 1, 16329, 26, "Andra svar till förta", new DateTime(2016, 01, 24, 10, 43, 06))); cList.Add(new Comment(29, 1, 16329, 28, "Svar till andra svar till första", new DateTime(2016, 01, 24, 10, 43, 23))); 

vous avez besoin d’une méthode afin de sortinger les éléments

 public static IEnumerable Sort(List SortItemsList, int parentID = 0) { foreach (var item in SortItemsList.Where(x => x.comment_parent_id == parentID).OrderBy(x => x.comment_id).ToList()) { yield return item; foreach (var child in Sort(SortItemsList, item.comment_id)) { yield return child; } } } 

et un pour déterminer la profondeur de la hiérarchie de chaque élément

 public static int GetDepth(List cList, Comment cItem) { if (cItem.comment_parent_id == 0) { return 0; } else { return GetDepth(cList, cList.Where(x => x.comment_id == cItem.comment_parent_id).Single()) + 1; } } 

Exemple:

 foreach (Comment cItem in Sort( cList)) { Console.WriteLine(GetDepth(cList, cItem) + " | " + cItem.ToSsortingng()); } 

Une autre approche serait le traitement nested des commentaires, comme décrit ici .