.NET Logo
Welcome Guest Search | Active Topics | Members | Log In | Register

สอบถามเรื่อง เกี่ยวกับ query นิดนึงอ่ะคับ Options · View
dekzerza
Posted: Tuesday, March 04, 2008 3:21:26 AM
Rank: มือสมัครเล่น
Groups: Member

Joined: 3/4/2008
Posts: 12
Location: thai

คือผม มี

class Node
{
    int id;
    string data;
}
 
class tree
{
    Node i;
    tree l_child;
    tree r_child;
}

ลักษณะคือมันเป็น Tree (แบบrecusive)อ่ะครับ Node เก็บค่าเป็น ID กับ data

โดยผมจะโหลด ข้อมูลจากใน ดาต้าเบส อ่ะคับมาทำ Tree ตัวนี้อ่ะคับ

โดย Table ผมจะเก็บประมานนี้อ้่ะคับ
ID    DATA   L_childid  R_childid parent_id(ไม่แน่ใจ)

 

คือผมจะเขียนให้มันไล่ แอดลง tree ตั้งแต่  ข้อมูลใน Record แรกลงใน ทรียังไงดีอ่ะคับให้มันครบทุกตัว

ปล.ไม่ทราบว่าจะเข้าใจคำถามผมหรือป่าวอ่ะคับ - -
แล้วจะติดต่ออาจาน ได้อย่างไรอ่ะคับ

ball
Posted: Thursday, March 06, 2008 3:03:14 AM

Rank: อาจารย์
Groups: Administration

Joined: 12/1/2007
Posts: 473
Location: Bangkok

ลองดูตัวอย่างที่ผมทดลองเขียนขึ้นมาดูนะครับ ผมยังไม่ได้ทดสอบจริง แต่คิดว่าน่าจะใช้ได้นะ

using System.Data;
using System.Collections.Generic;
 
class Program
{
    static void Main(string[] args)
    {
        DataTable table = new DataTable();

        // TODO: สมมติว่าคุณได้ทำการดึงข้อมูลมาจากฐานข้อมูลมาเก็บไว้ที่ table เรียบร้อยแล้ว

        Dictionary<int, Node> nodes = new Dictionary<int, Node>();
 
        DataView view = new DataView(table);
        view.RowFilter = "parent_id=0"; // 0 หมายถึง Node แรก
        int rootId = (int)view[0]["ID"];
 
        Node rootNode = CreateNode(table, nodes, rootId);
    }
 
    static Node CreateNode(DataTable table, Dictionary<int, Node> nodes, int id)
    {       
        DataView view = new DataView(table);
        view.RowFilter = "ID=" + id.ToString();
               
        string data = view[0]["DATA"].ToString();
        int parentId = (int)view[0]["parent_id"]; // 0 หมายถึง Node แรก
        int leftChildId = (int)view[0]["L_childid"]; // 0 หมายถึง ตัวสุดท้าย
        int rightChildId = (int)view[0]["R_childid"]; // 0 หมายถึง ตัวสุดท้าย
 
        Node node = new Node();
        nodes.Add(id, node);
        node.id = id;
        node.data = data;
 
        if (parentId == 0) node.parentNode = null;
        else if (nodes[parentId] != null) node.parentNode = nodes[parentId];
        else node.parentNode = CreateNode(table, nodes, parentId);
 
        if (leftChildId == 0) node.leftChildNode = null;
        else if (nodes[leftChildId] != null) node.leftChildNode = nodes[leftChildId];
        else node.leftChildNode = CreateNode(table, nodes, leftChildId);
 
        if (rightChildId == 0) node.rightChildNode = null;
        else if (nodes[rightChildId] != null) node.rightChildNode = nodes[rightChildId];
        else node.rightChildNode = CreateNode(table, nodes, rightChildId);
 
        return node;
    }
}
 
class Node
{
    public int id;
    public string data;
    public Node parentNode;
    public Node leftChildNode;
    public Node rightChildNode;
}


Imagination is more Important than Knowledge... /A.Einstein
mrxc
Posted: Friday, March 07, 2008 1:53:30 AM
Rank: มือเทพ
Groups: Member

Joined: 3/6/2008
Posts: 196
Location: TH

ผมว่าน่าจะแก้ที่ Database  ก่อนนะครับ Table น่าจะออกแบบผิด Concept ครับไม่สมควรจะมี R, L Child ครับ มี Parrent ตัวเดียวก็เกินพอครับ แต่ถ้าต้องกหาร Tree ที่มีซ้ายขวาชัดเจนก็ให้ใช้ flag ไปอีกตัวนึงว่าเป็น R, L ครับ

 

และอีกอย่างครับทายได้เลยครับว่า Stack Overflow จาก Class  Node

 

ผมอาจจะเข้าใจ concept ของผู้ถามผิดนะครับดังนั้นถ้าคำตอบออกมาแบบไม่เป็นที่ต้องการก็ขออภัยด้วยนะครับ

dekzerza
Posted: Saturday, March 08, 2008 5:47:44 PM
Rank: มือสมัครเล่น
Groups: Member

Joined: 3/4/2008
Posts: 12
Location: thai

ขอบคุณ อาจานย์มากครับ

ถึง Rep บน ผมก็คิดอย่างนั้นเช่นกันตอนนี้ ขอบคุณมากคับ ที่ออกความคิดเห็น

ว่าแต่ Stack Overflow คืออะไรหรอครับ

ใช่ ข้อมูลมากเกินไปจน Node รองรับไม่ไหวป่าวครับ

mrxc
Posted: Saturday, March 08, 2008 6:29:25 PM
Rank: มือเทพ
Groups: Member

Joined: 3/6/2008
Posts: 196
Location: TH

Stack Over Flow คือ...........พูดไม่ออกบอกไม่ถูกอ่ะครับ มันยาวเกินกว่าที่จะอธิบายได้ตอนนี้

 

เอาเป็นว่าจะเป็นการ Error เนื่องจากมีการเก็บค่าที่ใช้ในการย้อนกลับไปจุดเดิมมากเกินกว่าสหน่วยความจำจะมีให้ครับ

 

ซึ่งจากที่ผมกลาวถึงจะมาจาก

class Node
{
    public int id;
    public string data;
    public Node parentNode;     <<<<<<<<<<  จุดที่ 1
    public Node leftChildNode;   <<<<<<<<<<  จุดที่ 2
    public Node rightChildNode; <<<<<<<<<<  จุดที่ 3
}

แต่แบบที่คุณทำนั้นไม่มีครับขอโทษทีครับ

แต่ก็ไม่ทุกกรณีไปนะครับ จากข้างบนก็แก้ปัญหาได้โดยทำเป็น Method, Properties ไปครับปัญหาก็จะจบ

แต่ถ้าเป็นตัวแปรธรรมดาแบบข้างบนล่ะมีปัญหาแน่ครับ

Users browsing this topic
Guest


Forum Jump
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.

Main Forum RSS : RSS

YAFVision Theme Created by Jaben Cargman (Tiny Gecko)
Powered by Yet Another Forum.net version 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.


Sponsored by