ツリーのような構造を作成できる、一般的で洗練されたアルゴリズムを見つけることも、思いつくこともできませんでした。最も簡単な例はブログアーカイブです。日付で選択して並べ替えることができるレコードがたくさんあります。年がトップレベル、月が次のレベル、実際の投稿タイトルが再び次のレベルになるツリーが必要です。
これまでのところ、機能する単純で単純な実装を考え出しましたが、LINQなどを使用して改善できると確信しています。ここでは、レコードを日付で並べ替え、年または月が変更されたかどうかを繰り返しチェックして、追加します。それに応じてツリーノード。「BlogEntry」は、親と子の両方への参照を持ち、後でHTMLを生成するために使用されるクラスです。
アルゴリズムの改善に関する提案を歓迎します!
IEnumerable<Post> posts = db.Posts.OrderBy(p => p.DateCreated);
var topPost = posts.First();
int curYear = topPost.DateCreated.Year;
int curMonth = topPost.DateCreated.Month;
//create first "year-level" item
var topYear = new BlogEntry { Name = topPost.DateCreated.Year.ToString().ToLink(string.Empty) };
entries.Add(topYear);
var currentYear = topYear;
var topMonth = new BlogEntry { Name = topPost.DateCreated.ToString("MMMM").ToLink(string.Empty), Parent = currentYear };
currentYear.Children.Add(topMonth);
var currentMonth = topMonth;
foreach (var post in posts)
{
    if(post.DateCreated.Year == curYear)
    {
        if (post.DateCreated.Month != curMonth)
        {
            //create "month-level" item
            var month = new BlogEntry { Name = post.DateCreated.ToString("MMMM").ToLink(string.Empty), Parent = currentYear };
            currentYear.Children.Add(month);
            currentMonth = month;
            curMonth = post.DateCreated.Month;
        }
        //create "blog entry level" item
        var blogEntry = new BlogEntry { Name = post.Title.ToLink("/Post/" + post.PostID + "/" + post.Title.ToSeoUrl() ), Parent = currentMonth };
        currentMonth.Children.Add(blogEntry);
    }
    else
    {
        //create "year-level" item
        var year = new BlogEntry { Name = post.DateCreated.Year.ToString().ToLink(string.Empty) };
        entries.Add(year);
        currentYear = year;
        curMonth = post.DateCreated.Month;
        curYear = post.DateCreated.Year;
    }
}