私はかなり些細な問題があるはずですが、私はこれを.NET 4.5で可能な最もエレガントな方法でやっていることを確認したいと思います私より賢い人からの意見一般的なツリー構造 - 組織図を作成する方法
public class TreeNode<T>
{
List<TreeNode<T>> Children;
T Item {get;set;}
public TreeNode (T item)
{
Item = item;
}
public TreeNode<T> AddChild(T item)
{
TreeNode<T> nodeItem = new TreeNode<T>(item);
Children.Add(nodeItem);
return nodeItem;
}
}
は今、私は組織の従業員を表しPersonクラスを持っている:
は私のような一般的なツリー構造を表すクラスを持っています。各Person
オブジェクトは、その上位を指しているID
とBossID
を持ちます。
複数の従業員が同じボスを持つことができます。なぜこのツリー構造の組織図を作成しようとしていますか。
先頭ノードは、BossID
がヌル(int?
)のPerson
オブジェクトになります。私はすぐにLINQを手に入れることができます。
これは私に少し困惑している次のステップです。複数のアプローチがありますが、どちらかというと私には少しばかり見えますが、残りの組織図を記入するのははるかに簡単でエレガントな方法でなければなりません。
今私はList<Person>
という一般的なオブジェクトを持っていて、さまざまなBossID
と子ノードを追加できる汎用ツリー構造を持っています。
これはすべて非常に基本的ですが、ツリーを埋める正しい順序は何ですか?私は再帰的に行を反復することになっていますか?ここにはバックトラックが含まれていることがわかります。ここで私は困惑しています。
私はお詫びします、私の背景はコンピュータサイエンスではありません、そして、私はそれが木構造、リンクされたリスト、および他のすべてが些細なものであることを認識していました。しかしこれは私の最初の試みであり、どのように正しく行われているかを見たいと思っています。
どのようなガイダンスもありがとうございます。
public class Person
{
public int ID;
public int? BossID;
}
...そしてあなたがpeople
として定義されList<Person>
を持っている、これは動作します:
var lookup = people.ToLookup(p => p.BossID);
Action<TreeNode<Person>> addChildren = null;
addChildren = p =>
{
foreach (var child in lookup[p.Item.ID])
{
var childNode = p.AddChild(child);
addChildren(childNode);
}
};
var trees =
from boss in lookup[null]
select new TreeNode<Person>(boss);
foreach (var tree in trees)
{
addChildren(tree);
}
これは、あなたがかもしれないことを前提としていますが、このように定義Person
クラスを持って与えられたので、
だから、基本的にあなたの質問は、あなたが人のリストを持っていると仮定して、orgツリーを作成することですか? –
それはそれほど簡単です。私はその汎用ツリークラスを持っています。自分のIDとBossのIDを持つPeopleオブジェクトのList <>を持っています。私はちょうど4.5の下で最もクリーンなアプローチが何であるかを知りたい。私は木を埋める方法を調べることができますが、そこには非常に貧弱な例がいくつかあり、入力を探しています。 LINQのようなものでは、私のためのコードが大幅に簡素化されています。 – Patrick