2017-01-08 4 views
0

Linqを使用して親と子のグループにオブジェクトをソートし、各オブジェクトがparentIdに関連付けられている13883個のオブジェクトのやや大きなリストからツリーを作成しようとしています。一緒にlinqを使用して子供にリストをソートする

var sortedList = marketItems.GroupBy(p => p.parentId).Select(grp => grp.ToList()).ToList(); 

を使用しますが、これは唯一のグループに分類し、私はまだLINQと流暢じゃないと正しく子供をマッピングする方法を見つけ出す傾けます。 null ParentGroupはツリーの最上位レベルです。 Linqの経験が豊富な方なら、llistを正しくグループ化する方法についていくつかのアイデアを提供することができます。

enter image description here

public JsonResult GetJsTree3Data() 
    { 
     var marketItems = new List<JsTree3Node>(); 
     var itemList = new List<JsTree3Node>(); 

     foreach (var group in GenerateGroups(connString)) 
     { 
      var node = JsTree3Node.NewNode(group.id_str); 
      node.text = group.name; 
      node.state = new State(false, false, false); 
      node.parentId = group.marketParentGroup; 
      marketItems.Add(node); 
     } 

     foreach (var group in GenerateItems(connString)) 
     { 
      var node = JsTree3Node.NewNode(group.id_str); 
      node.text = group.name; 
      node.state = new State(false, false, false); 
      node.parentId = group.marketParentGroup; 
      marketItems.Add(node); 
     } 

     // Create our root node and ensure it is opened 
     var root = new JsTree3Node() 
     { 
      id = "0", 
      text = "Market Items", 
      state = new State(true, false, false) 
     }; 

     var sortedList = marketItems.GroupBy(u => u.parentId).Select(grp => grp.ToList()).ToList(); 


     root.children = sortedList; 

     return Json(root, JsonRequestBehavior.AllowGet); 
    } 

私はachiveをしようとしている最終的な結果は、ユーザーが選択できる項目のツリーです。木の唯一のレベルがある子供たちがソートされたリストに

enter image description here

+1

あなたがしていることがわかりません。親グループ2とは何ですか?たとえば、アイテムID 2157(構造変更、親グループ2)の親となっているアイテムなどの識別子がありますか?あなたのデータには私がそれを導き出すことができる何も表示されません。 –

+0

最終目標は、親子ペアのリストを出すことです。 – Abion47

+0

各親の下にある子のリストを別々にソートしたいですか?彼らは名前で並べ替えるべきですか? –

答えて

1

、親は複数の項目を含めることができます。私は、これはあなたが探しているものであると信じて:

  var sortedList = from p in marketItems 
          group p by p.ParentGroup into Groups 
          select Groups; 
      //to access the items in each group individually 
      foreach (var grouping in sortedList) 
      { 
       foreach (var Item in grouping) 
       { 
        Item.Description///you can access the individual items from this layer... 
       } 
      } 

あなたのコードはこれを行う必要がありますが、ネストしたforeachのを使用する必要がグループ化項目にアクセスするにはループ。

+0

あなたの最終データ形式がわかりません。アイテムはグループ化され、parentGroupの順にアクセスされます。あなたはこれからどんなデータ構造を構築しても構いません... –

0

を命じアレントように私はあなたの最終目標が何であるかわからないんだけど、あなたがしようとしているものかどうかはわかりません単一のLINQパスで厳密に行うことができます。可能であれば、それはかなり複雑であると想像します。その後

var refDict = marketItems.ToDictionary(k => k.Id, v => v); 
var groupedList = marketItems.Select(s => 
       new 
       { 
        Parent = s.ParentGroup == null ? null : refDict[s.ParentGroup], 
        Child = s 
       }).ToList(); 

をこのようにそれを使用します:あなたはしかし、非常に単純に2つのLINQクエリでそれを行うことができ、すべての正直で

var parent = groupedList[0].Parent; 
var child = groupedList[0].Child; 

、しかし、あなただけのコードの最初の行に自分自身を保つことができますあなたがそれを必要とする場合は、辞書にオブジェクトの親を照会してください。私が見

関連する問題