2013-10-02 11 views
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を使用して並べ替えるために、この情報を持つことは可能ですか?

例では、次のことがあります:私は悩み、これはどのように行われるかを中心に、またはそれがある場合は私の頭をラップを持っています

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

ID | Position | PreviousID | Message| 

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

は、次の順序にソートされます可能であれば、私は正しい方向へのちょっとした動きにも大いに感謝します。ありがとう!

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

+0

私がすべきhttp://stackoverflow.com/questions/17968069/linq-sort-a-flat-list-based-on-childorderかなり確信している:ここで

は、私はお勧めは何かということです私がこれを正しく読んでいるなら、あなたのために働きます。 –

答えて

2

LINQはここ

に参加Recursive Hierarchical Joins in C# and LINQの一例であり、それはあなたが何をしたいんを通じて簡単な散歩を提供します。

キーは少し異なりますが、例にマップする必要があります。

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); 
    } 
}