2012-05-01 3 views
3

は、私は本当に新しいです#データテーブルを介して、ループを階層的なクラス構造を作成し、親と子を追加し、返すオブジェクト

は、私は、オブジェクトのすべての次heirarchichal構造を表すことができ、クラス構造を作成したいCまで同じタイプ

-Parent1 
- - Child1 
- - - ChildA of Child1 
- - - ChildB of Child1 
- - Child2 
- - - ChildA of Child2 
- - - ChildB of Child2 
- Parent2 

データテーブルの行

レベルが子供1の親、1 O 2はChildAためなどであるID、のParentID、名前とレベルを有する

DBからデータテーブルにデータを返すことはできますが、それ以降は苦労しています クラス構造を作成してオブジェクトにデータを入力すると助けになるでしょう。

+0

あなたのタイプはここで何しています - Child1とChild2は異なるのですか? – Dave

+0

この階層は、どのようにあなたのdataTableで表されますか?あなたは例を挙げてくれますか? – digEmAll

+0

親子はすべて同じタイプです – cWilk

答えて

9

ここでは、LINQを使用してそれを行う方法の例を示します。最初に、sampeデータテーブル。

class Item { 

    public Int32 Id { get; set; } 

    public String Name { get; set; } 

    public IEnumerable<Item> Children { get; set; } 

} 

特定の項目の子を取得するための機能::私はトップレベルの項目は、データの各項目を表すために0

var dataTable = new DataTable(); 
dataTable.Columns.Add("Id", typeof(Int32)); 
dataTable.Columns.Add("ParentId", typeof(Int32)); 
dataTable.Columns.Add("Name", typeof(String)); 
dataTable.Rows.Add(new Object[] { 1, 0, "A" }); 
dataTable.Rows.Add(new Object[] { 2, 1, "B" }); 
dataTable.Rows.Add(new Object[] { 3, 1, "C" }); 
dataTable.Rows.Add(new Object[] { 4, 0, "D" }); 
dataTable.Rows.Add(new Object[] { 5, 4, "E" }); 

クラスの親IDを持っていることを前提とし

IEnumerable<DataRow> GetChildren(DataTable dataTable, Int32 parentId) { 
    return dataTable 
    .Rows 
    .Cast<DataRow>() 
    .Where(row => row.Field<Int32>("ParentId") == parentId); 
} 

子コレクションを含むアイテムを作成する機能。一緒にすべてを置く

IEnumerable<DataRow> GetTopLevelRows(DataTable dataTable) { 
    return dataTable 
    .Rows 
    .Cast<DataRow>() 
    .Where(row => row.Field<Int32>("ParentId") == 0); 
} 

Item CreateItem(DataTable dataTable, DataRow row) { 
    var id = row.Field<Int32>("Id"); 
    var name = row.Field<String>("Name"); 
    var children = GetChildren(dataTable, id) 
    .Select(r => CreateItem(dataTable, r)) 
    .ToList(); 
    return new Item { Id = id, Name = name, Children = children }; 
} 

トップレベルのアイテムの行を取得する機能:この関数は、階層を下に再帰ます

var items = GetTopLevelRows(dataTable) 
    .Select(row => CreateItem(dataTable, row)) 
    .ToList(); 
+0

oops、実際にデータセットを使用していますが、それは大幅に変更されますか? – cWilk

+0

'DataSet'は' Tables'コレクションを含んでいます。データを含むテーブルを選択します。 –

+0

ya、私はそれを理解し、使用しました - 返すResultSet.Tables [0]私のテーブルを取得する – cWilk

2

上記の情報があればただ1つのクラス。ここで

public class MyItem 
{ 
    public IList<MyItem> ChildItems{get;set;} 
} 

あなたは基本的に子供のように、独自の型のコレクションを含むことができ、これにより、これらの子供たちは、サブ子としてあまりにもMYITEMのコレクションを含めることができるオブジェクトを持っています。

var parentItem = new MyItem() 
var childItem = new MyItem(); 
var childChildItem = new MyItem(); 

childItem.ChildItems.Add(childChildItem); 
parentItem.ChildItems.Add(childItem); 

は、項目の追加をコーディングするよりよい方法がありますが、コンセプトが明確にするために、これは論理的に十分にそれを分解:

には、以下のことを検討してください。

関連する問題