4

アイテムのリストがあります

  • ID名ParentID
  • 1 abc 0(レベル1)
  • 2 def 1
  • 3ギ1
  • 4 jkl 0
  • 5 mno 2
  • 6 pqr 5
  • 7 aaa 1
  • 8 vwx 0

リストを次のように並べ替えたい

abc、aaa、def、mno、ghi、jkl、vwx、

つまり、親(名前の昇順)、その子(名前の昇順)、子のサブ子(子の昇順)など、最後のレベルまで、そして再び親が必要です。私は持っています

sections = new List<section>( from section in sections
                     group section by section.ParentID into children
                     orderby children.Key
                     from childSection in children.OrderBy(child => child.Name)
                     select childSection);

ただし、リストをabc、jkl、vwx、aaa、def、ghi、mno、pqrとしてソートします。

誰かが私がどこで間違っているのか教えてもらえますか?

4

2 に答える 2

5

これは、スタックを使用した完全なソリューションです。これは間違いなく改善される可能性がありますが、これは一般的なアルゴリズムです。

public class Section
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ParentID { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        var sections = new List<Section>
            {
                new Section { ID = 1, Name = "abc", ParentID = 0 },
                new Section { ID = 2, Name = "def", ParentID = 1 },
                new Section { ID = 3, Name = "ghi", ParentID = 1 },
                new Section { ID = 4, Name = "jkl", ParentID = 0 },
                new Section { ID = 5, Name = "mno", ParentID = 2 },
                new Section { ID = 6, Name = "pqr", ParentID = 5 },
                new Section { ID = 7, Name = "aaa", ParentID = 1 },
                new Section { ID = 8, Name = "vwx", ParentID = 0 }
            };

        sections = sections.OrderBy(x => x.ParentID).ThenBy(x => x.Name).ToList();
        var stack = new Stack<Section>();

        // Grab all the items without parents
        foreach (var section in sections.Where(x => x.ParentID == default(int)).Reverse())
        {
            stack.Push(section);
            sections.RemoveAt(0);   
        }

        var output = new List<Section>();
        while (stack.Any())
        {
            var currentSection = stack.Pop();

            var children = sections.Where(x => x.ParentID == currentSection.ID).Reverse();

            foreach (var section in children)
            {
                stack.Push(section);
                sections.Remove(section);
            }
            output.Add(currentSection);
        }
        sections = output;
    }
于 2012-09-17T22:20:21.813 に答える
0

最初に子の名前で並べ替え、次に親の ID でグループを並べ替えます。それ以外の場合は、レコードがグループ化されると、グループ内でのみ並べ替えられるため、現在得ている出力は完全に正しいためです。

于 2012-09-17T22:21:25.730 に答える