2012-09-17 79 views
4

我有物品多級父子排序

  • ID名稱PARENTID
  • 1 ABC 0(1級)
  • 2 DEF 1
  • 3 GHI 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,京客隆,VWX,AAA,DEF,GHI,MNO,PQR

任何人可以讓我知道我要去哪裏錯了。

+0

你可以調用sections.Sort列表

後populated..otherwise締造出款款如排序清單 – MethodMan

+0

我已編輯您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

謝謝我今後不會這樣做 –

回答

4

這是一個使用堆棧的完整解決方案。這絕對可以改善,但它是一般算法。

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; 
    } 
+0

沒有領域作爲水平...我只是標記顯示根。對困惑感到抱歉。 –

+0

糟糕。這應該是'ParentID' –

+0

這給了我同樣的結果 –

0

通過孩子的名字,然後才能由父ID組一階,否則跟你有什麼,現在你得到的輸出是絕對正確的,因爲一旦記錄進行了分組,他們是有序的內部只分組。

+0

請你詳細解釋一下。在代碼中顯示我在哪裏我失蹤 –

+0

請告訴我我在哪裏錯了 –

0

這是一個遞歸問題,幾天以前類似的問題已經被問過了,一個有趣的回答是this one