none
DataTable處理問題? RRS feed

  • 問題

  • 有一個DataTable如下:  (下面可視為一顆樹)

    關鍵字   父節點    代表節點

    A            null

    B             A

    C             A

    D             C

    E              D

    F              D

    G             D

    H             G

    轉換成,有同父節點則使用代表節代表它,然後找出代表節點的父節點出來!!

    輸出變成下方這樣

    關鍵字   父節點    代表節點

    A            null

    B             A           0

    C             A           0

    D             C

    E              D           1

    F              D           1

    G             D           1

    H             G

    0            A

    1             D

    要怎麼處理阿??  謝謝~

    不好意思,這個0我沒有交待清楚

    0只是用來代表當作一個節點的代名詞,我使用代表節點的名稱選用方式是從 int i=0開始!!

    • 已編輯 thinklover 2010年4月6日 上午 11:49
    2010年4月6日 上午 10:04

解答

  • Hi,

    參考

    String[,] value = { { "A", "" } ,
                                  { "B", "A" } ,
                                  { "C", "A" } ,
                                  { "D", "C" } ,
                                  { "E", "D" } ,
                                  { "F", "D" } ,
                                  { "G", "D" } ,
                                  { "H", "G" } ,
                                    };
                DataTable dt = new DataTable();
                dt.Columns.Add("KeyWord");
                dt.Columns.Add("ParentNode");
                dt.Columns.Add("TempNode");
                          
                for (int idx = 0; idx < value.GetLength(0); ++idx)
                {
                    dt.Rows.Add(new object[] { value[idx, 0], value[idx, 1] });
                }
                           
                int rowCount = dt.Rows.Count;
                List<string> tempNodes = new List<string>();
                for (int idx = 0; idx < rowCount; ++idx)
                {
                    DataRow dr = dt.Rows[idx];
                    string parent = dr[1].ToString();
                    if (tempNodes.Contains(parent))
                    {
                        dr[2] = tempNodes.IndexOf(parent);
                    }
                    else if (dt.Select("ParentNode = '" + parent + "'").Count() > 1)
                    {                   
                        tempNodes.Add(parent);
                        dr[2] = tempNodes.IndexOf(parent);
                        dt.Rows.Add(new object[] { dr[2], parent });                    
                    }
                }


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 thinklover 2010年4月10日 上午 11:18
    2010年4月7日 上午 05:05

所有回覆

  • 為什麼代表節點是 0 , 而不是B 或 C ? 0 又是怎麼冒出來的 ? 這個邏輯你可能要解釋地清楚一點 ?
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月6日 上午 10:17
    版主
  • Hi,

    看不太懂你到底想做什麼,直接判斷父節點那個欄位是否為null或空值不行嗎?


    My Blog:http://www.dotblogs.com.tw/alonstar
    解決問題之後,別忘了回到論壇把正確回應標示成解答哦!
    2010年4月6日 上午 10:18
  • 你指的是把  重覆的父節點才 show 在真正的節點上,請問是這樣的意思嗎?
    如果是這樣... 你可以參考一下:

                Hashtable MyList = new Hashtable();
                MyList.Add("B","A");
                MyList.Add("C","A");
                MyList.Add("D","C" );
                MyList.Add("E","D" );
                MyList.Add("F","D" );
                MyList.Add("G","B" );
                MyList.Add("H","D" );
    
                String[] KeyWord = new String[] { "A", "D" };
    
                foreach (DictionaryEntry de in MyList)
                {
                    for (int i = 0; i <= KeyWord.Rank; i++ )
                    {
                        if (de.Value == KeyWord[i])
                        {
                            // todo: 插入你的程式碼,Ex: 加入節點...等
                                    // 下方只是顯示 MessageBox 之結果
                            MessageBox.Show(de.Key.ToString());
                        }
                    }
                }

    逐步學習,逐夢踏實;腳步要踩穩,這樣下一步才不會跌倒。 http://www.dotblogs.com.tw/nobel12
    2010年4月7日 上午 02:37
  • Hi,

    參考

    String[,] value = { { "A", "" } ,
                                  { "B", "A" } ,
                                  { "C", "A" } ,
                                  { "D", "C" } ,
                                  { "E", "D" } ,
                                  { "F", "D" } ,
                                  { "G", "D" } ,
                                  { "H", "G" } ,
                                    };
                DataTable dt = new DataTable();
                dt.Columns.Add("KeyWord");
                dt.Columns.Add("ParentNode");
                dt.Columns.Add("TempNode");
                          
                for (int idx = 0; idx < value.GetLength(0); ++idx)
                {
                    dt.Rows.Add(new object[] { value[idx, 0], value[idx, 1] });
                }
                           
                int rowCount = dt.Rows.Count;
                List<string> tempNodes = new List<string>();
                for (int idx = 0; idx < rowCount; ++idx)
                {
                    DataRow dr = dt.Rows[idx];
                    string parent = dr[1].ToString();
                    if (tempNodes.Contains(parent))
                    {
                        dr[2] = tempNodes.IndexOf(parent);
                    }
                    else if (dt.Select("ParentNode = '" + parent + "'").Count() > 1)
                    {                   
                        tempNodes.Add(parent);
                        dr[2] = tempNodes.IndexOf(parent);
                        dt.Rows.Add(new object[] { dr[2], parent });                    
                    }
                }


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 thinklover 2010年4月10日 上午 11:18
    2010年4月7日 上午 05:05
  • 謝謝蹂躪大大的教學~

    關於這一行   for (int idx = 0; idx < rowCount; ++idx)

    如果把 rowCount改成dt.Rows.Count (因為新成立的節點也要繼續判斷下去...)

    就會有問題發生耶~ 

    順便想問一下大大,如果不開List去存這些父節點

    DataTable可以自己join自己嗎? (Self-join)

    這方面我不太了解?

    2010年4月7日 下午 01:15
  • 如果把 rowCount改成dt.Rows.Count (因為新成立的節點也要繼續判斷下去...)

    這句話是指...?看不懂?

    這邊rowCount是故意寫的

    但是改為dt.Rows.Count我這邊也不會有錯誤發生

    只是跑出來的值會跟你要的不一樣

    不知您說的錯誤是...?


    若不開List去存父節點

    目前我找不到方法

    看了一下DataTable的Select寫法,好像沒有可以做到的

    而且您要的還需要新增節點進去

    又要更改本來資料列的資料

     

    另外這段Code是依您所提的需求所寫的

    可是還是不太清楚您要弄出代表節點的原因

    看您的需求來看

    只是要把資料塞成樹狀

    方便使用For 1~n去處理

    但為何只有含兩個子節點的要處理就不清楚了

    而代表節點的欄位看起來也是多餘的


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年4月7日 下午 03:55