2

このC# および LINQ での再帰的階層結合の投稿に従って、アプリケーションでツリー ビュー データを表示する再帰的結合拡張機能を実装しました。私は15000個のツリーノードを持っているので、バグのあるブラウザIE 7&8では、クライアント側の準備でjQuery DynaTreeに多くの時間がかかります(50秒)

これを回避するために、最初は 1 つのレベルのみをロードし、次に必要に応じて他の子をロードすることにしました (遅延ロード)。

しかし、再帰結合で深さを設定する効果は見られませんでした。私が指定しても、すべてのノードを準備します。

public static List<DynaTreeNode> GenerateTreeByDepth(List<NodeDTO> nodeList, 
   int deepLevel)
  {

  StringBuilder hirTree = new StringBuilder();
  List<DynaTreeNode> tree = new List<DynaTreeNode>();

  IEnumerable<DynaTreeNode> nodes = nodeList.RecursiveJoin
  (element => element.DataPointSK,element => element.DataPointSKParent,
  (NodeDTO element, int index, int depth,IEnumerable<DynaTreeNode> childNodes) => 
                new DynaTreeNode()
               {
                   title = element.DataPoint,
                   key = element.DataPointSK.ToString(),
                   children = childNodes.ToList(),
                   select = element.selected,
                   expand = element.selected,                      
                   Depth = deepLevel
               });
        tree = nodes.ToList();          
        return tree;

    }

奥行きを設定してみた

深さ = 深いレベル

しかし、役に立たない。問題は何ですか?これどうやってするの?

4

1 に答える 1

0

RecursiveJoin 拡張メソッドは、未加工のノードからツリーを構築するために使用されます。使用しているオーバーロードには、int depth パラメータが渡され、新しく作成されたノードが存在するレベルで初期化され、構築されるツリーの深さとは関係ありません。

拡張自体は怠け者です。RecursiveJoin を初めて呼び出すと、ルートの IEnumerable<> が返されますが、これは列挙を開始するまで具体化されません。

コードの問題は、子の IEnumerable<> を熱心にリストに変換することです。

children = childNodes.ToList()

これにより、children コレクションの実体化が強制され、同じメソッドが再帰的に呼び出されて DynaTreeNode が構築され、すべてのレベルで繰り返されます。DynaTreeNode の子リストを IEnumerable に置き換えてみてください。これにより、オンデマンドで DynaTreeNode が生成されます。

または、リストを保持して、上記の行を次のコードに置き換えることができます。

子供 = 深さ >= 深いレベル ? null : childNodes.ToList()

これにより、予想どおり、渡されたレベルでツリーが切断されます。

于 2013-03-28T22:13:03.290 に答える