4

すべて同じタイプのオブジェクトの次の階層構造を表すことができるクラス構造を作成したい

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

データテーブルの行には、ID、ParentID、名前、レベルがあります

レベルは、親の場合はO、子の場合は1、ChildAの場合は2などです。

DBからデータテーブルにデータを返すことはできますが、その後苦労しています。クラス構造を作成してオブジェクトにデータを入力するためのヘルプをいただければ幸いです。

4

3 に答える 3

9

LINQ を使用してそれを行う方法の例を次に示します。まずサンプルのデータテーブル。トップレベルのアイテムの親 ID は 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" });

データの各項目を表すクラス:

class Item {

  public Int32 Id { get; set; }

  public String Name { get; set; }

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

}

特定のアイテムの子を取得する関数:

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

子コレクションを含むアイテムを作成する関数。この関数は、階層を下に再帰します。

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

最上位アイテムの行を取得する関数:

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

すべてを一緒に入れて:

var items = GetTopLevelRows(dataTable)
  .Select(row => CreateItem(dataTable, row))
  .ToList();
于 2012-05-01T10:05:35.967 に答える
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);

アイテムの追加をコーディングするより良い方法がありますが、これは概念を明確にするために論理的に十分に分解しています。

于 2012-05-01T09:40:16.253 に答える