5

非常に難しい並べ替えの問題に遭遇しました。誰かがこれを理解するのを手伝ってくれるかどうか疑問に思っています。基本的に、次の情報でいっぱいの 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?

これがどのように行われるか、またはそれが可能であるかどうかについて頭を悩ますのに苦労しているので、正しい方向への微調整だけでも大歓迎です、ありがとう!

さらに詳しい情報として、これは消去できないコンテンツがたくさんある既存のテーブルです。この方法で並べ替える方法を見つける必要があります。

4

2 に答える 2

2

LINQ はこれを階層結合でモデル化できます

これは、 C# と LINQでの再帰的階層結合の例であり、必要なことを行う簡単な手順を示しています。

キーは少し異なりますが、例にマッピングできるはずです。

于 2013-10-02T03:48:08.687 に答える
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);
    }
}
于 2013-10-02T06:10:40.673 に答える