困难的分层排序

时间:2013-10-02 03:28:12

标签: c# sql linq sorting

我遇到了一个非常困难的排序问题,我想知道是否有人可以帮我解决这个问题。基本上我有一个充满以下信息的SQL表:

ID (The comment's Unique Identifier)

Previous ID (The ID of the comment that is being replied to with this comment)

Position (The position of how "deep" the comment is, a post directly on a 
page would be "1" a reply to that "2", etc.

这些信息是否可以使用C#/ LINQ进行排序,以便在调用时以正确的顺序返回?

示例可能如下:

ID | Position | PreviousID | Message|

1  | 1        | 0          | Hello
2  | 1        | 0          | How
3  | 2        | 1          | There!
4  | 2        | 2          | Are
5  | 3        | 4          | You?

将按以下顺序排序:

1. Hello
2. There!
3. How
4. Are
5. You?

我无法绕过如何做到这一点,或者甚至可能做到这一点,所以我非常感谢即使只是朝着正确的方向轻推,谢谢!

仅仅是为了获得更多信息,这是一个包含大量无法删除的内容的现有表格,我只需要找到一种以这种方式对其进行排序的方法。

2 个答案:

答案 0 :(得分:2)

LINQ可以使用Hierarchical Joins

对此进行建模

这是Recursive Hierarchical Joins in C# and LINQ的一个示例,并简单介绍了您想做什么。

键略有不同,但您应该能够映射到示例。

答案 1 :(得分:1)

这更像是树遍历问题,而不是排序问题。

以下是我的建议:

static IEnumerable<T> PreOrderTraverse<T>(IEnumerable<T> nodes, Func<T, IEnumerable<T>> childrenSelector)
{
    foreach (var node in nodes)
    {
        yield return node;

        foreach (var descendant in PreOrderTraverse(childrenSelector(node), childrenSelector))
        {
            yield return descendant;
        }
    }
}

static void Main(string[] args)
{
    /* Some code to load comments*/

    var children = comments.ToLookup(c => c.PreviousID);

    var result = PreOrderTraverse(children[0], c => children[c.ID]);

    foreach (var comment in result)
    {
        Console.WriteLine(comment.Message);
    }
}