먼저 트리를 만든 다음 루트에서 리프로 재귀 적으로 내려갑니다. 이 작업을 수행하는 방법에는 여러 가지가 여기에 하나가 있습니다 :
class Message {
public Message(int message_id, string text, int? parent_message_id) {
Debug.Assert(message_id < int.MaxValue);
MessageID = message_id;
ParentMessageID = parent_message_id;
Text = text;
}
public readonly int MessageID;
public readonly string Text;
public readonly int? ParentMessageID;
public static IEnumerable<Message> OrderByHierarchy(IEnumerable<Message> messages) {
// Key: ParentMessageID (null substituted with int.MaxValue).
// Value: All messages sharing this parent.
var dict = messages.GroupBy(m => m.ParentMessageID ?? int.MaxValue).ToDictionary(grouping => grouping.Key);
// For each root, recursively traverse its children.
return dict[int.MaxValue].SelectMany(root => RecursiveDescent(dict, root));
}
static IEnumerable<Message> RecursiveDescent(Dictionary<int, IGrouping<int, Message>> dict, Message parent) {
yield return parent;
IGrouping<int, Message> children;
if (dict.TryGetValue(parent.MessageID, out children))
foreach (var child in children)
foreach (var descendent in RecursiveDescent(dict, child))
yield return descendent;
}
public override string ToString() {
return string.Format("{0} | {1} | {2}", MessageID, Text, ParentMessageID == null ? "null" : Convert.ToString(ParentMessageID));
}
}
class Program {
static void Main(string[] args) {
var messages = new[] {
new Message(1, "Text 1", null),
new Message(2, "Reply to Text 1", 1),
new Message(3, "Reply to Text 1 #2", 1),
new Message(4, "Reply to reply to text 1", 2),
};
foreach (var m in Message.OrderByHierarchy(messages))
Console.WriteLine(m);
}
}
이 인쇄 :와
1 | Text 1 | null
2 | Reply to Text 1 | 1
4 | Reply to reply to text 1 | 2
3 | Reply to Text 1 #2 | 1
:
이 나에게의 출력을 제공? 왜 4가 3보다 먼저 나오나요? – BrokenGlass
정렬은 메시지에 대한 답장이됩니다 (ParentMessageID를보십시오) – John
답글 수를 기준으로 정렬 하시겠습니까? 아직도 이것은 3이 3보다 먼저 올 이유를 말해주지 않습니다. – BrokenGlass