2017-01-08 6 views
0

Я пытаюсь создать дерево из несколько большого списка из 13883 объектов с помощью Linq для сортировки объектов в родительских и дочерних группах, каждый объект связан с parentId, я могу сгруппировать объекты вместе с использованиемСортировка списка в дочерних элементах с использованием linq

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

но сортирует их только в группы, я не свободно с LINQ и не могу понять, как правильно отобразить детей. нулевой ParentGroup - это верхний уровень дерева. Любой, у кого больше опыта работы с linq, может предложить некоторые идеи о том, как правильно группировать список.

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

Мне непонятно, что вы пытаетесь сделать. Что такое Parent Group 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... 
       } 
      } 

Вашего код должны это сделать, но для доступа к группированию элементов, которые нужны использовать вложенный Еогеасп петля.

+0

Я не знаю, каков ваш конечный формат данных. Это группирует ваши элементы, а затем обращается к ним в последовательности их родительской группы. Вы можете построить любую структуру данных, которая вам нужна ... –

0

Я не уверен, что ваша конечная цель, но я не уверен, что вы пытаетесь do можно выполнить строго с помощью одного прохода LINQ. Если бы это было возможно, я полагаю, что это было бы довольно запутанно. Вы можете сделать это в двух 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(); 

Затем использовать его как это:

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

Во всей честности, хотя, вы могли бы просто держать себя в первой строке кода затем запросите словарь для родителя объекта самостоятельно, если он вам когда-нибудь понадобится.

Смежные вопросы