2015-05-23 84 views
-4

我有如下所示的數據庫中的菜單列表。如何在C#中爲下面顯示的數據創建一個類似於結構的對象樹。從對象列表中遞歸創建對象樹結構

Id MenuLabel ParentMenuId 
1 Home   0   // Main Menu 
2 MyAccounts  0   // Main Menu 
3 MyProfile  2   // Sub Menu, parent menu is MyAccounts 
4 Trade   0   // Main Menu 
5 Stock   4   // Sub Menu, parent menu is Trade 
6 Bonds   4   // Sub Menu, parent menu is Trade 

理想情況下,我需要在C#中的對象結構像這樣。任何最佳實踐或模式可用?

Home 
MyAccounts 
----MyProfile 
Trade 
----Stock 
----Bonds 
+0

每個MenuItem都包含也是MenuItem的子項的集合。或者每個MenuItem引用也是MenuItem的Parent。 –

+0

是的。每個MenuItem都包含也是MenuItem的子項的集合。 – Anish

回答

0

使用字典。 parentDict創建你正在尋找的結構。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("Id", typeof(int)); 
      dt.Columns.Add("MenuLabel", typeof(string)); 
      dt.Columns.Add("ParentMenuId", typeof(int)); 

      dt.Rows.Add(new object[] {1, "Home",0});   // Main Menu 
      dt.Rows.Add(new object[] {2, "MyAccounts",0}); // Main Menu 
      dt.Rows.Add(new object[] {3, "MyProfile",2}); // Sub Menu, parent menu is MyAccounts 
      dt.Rows.Add(new object[] {4, "Trade", 0});  // Main Menu 
      dt.Rows.Add(new object[] {5, "Stock", 4});  // Sub Menu, parent menu is Trade 
      dt.Rows.Add(new object[] {6, "Bonds", 4 });  // Sub Menu, parent menu is Trade 

      Dictionary<int, List<DataRow>> parentDict = dt.AsEnumerable() 
       .GroupBy(x => x.Field<int>("ParentMenuId"), y => y) 
       .ToDictionary(x => x.Key, y => y.ToList()); 


      Dictionary<int, DataRow> dict = dt.AsEnumerable() 
       .GroupBy(x => x.Field<int>("Id"), y => y) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 

      int menu = 3; 
      List<DataRow> parents = new List<DataRow>(); 
      for (int row = menu; (int)dict[row]["ParentMenuId"] != 0; row = (int)dict[row]["ParentMenuId"]) 
      { 
       parents.Add(dict[(int)dict[row]["ParentMenuId"]]); 
      } 


     } 

    } 

} 
​