2015-11-25 2 views
0

У меня есть этот список из более чем 2000 категорий, которые необходимо организовать в дереве перед отправкой на контроллер и представление, чтобы плагин javascript мог их правильно отобразить.Дерево объектов

Я уже делаю это, но исполнение ужасно. Для сборки дерева требуется примерно 30 секунд.

Я не вижу, что здесь понижает производительность. Можете ли вы, ребята, помочь мне улучшить этот код?

var allCategories = dal.Listar(); 
List<Model.Entity.CategoriaCursoEADVO> nestedCategories = new List<Model.Entity.CategoriaCursoEADVO>(); 

foreach (Model.Entity.CategoriaCursoEAD item in allCategories) 
{ 
    if (item.IdCategoriaPai == null) 
    { 
     CategoriaCursoEADVO child = new CategoriaCursoEADVO(); 

     child.id = item.Id; 
     child.text = item.Descricao; 
     nestedCategories.Add(child); 
     FillChild(allCategories, child, item.Id); 
    } 
} 

А вот метод FillChild:

public int FillChild(IEnumerable<CategoriaCursoEAD> categorias, CategoriaCursoEADVO parent, int IID) 
{ 
    var childCategories = categorias.Where(w => w.IdCategoriaPai.Equals(IID)); 
    parent.children = new List<CategoriaCursoEADVO>(); 

    if (childCategories.Count() > 0) 
    { 
     foreach (CategoriaCursoEAD cat in childCategories) 
     { 
      CategoriaCursoEADVO child = new CategoriaCursoEADVO(); 

      child.id = cat.Id; 
      child.text = cat.Descricao; 
      parent.children.Add(child); 
      FillChild(categorias, child, cat.Id); 
     } 
     return 0; 
    } 
    else 
    { 
     return 0; 
    } 
} 

Я думаю, что проблема с новыми экземплярами и попытался с помощью параллельных циклов, без satisfatory уровня улучшения.

+0

Удалось ли вам использовать делегат ForEach? – Praveen

+0

Нет, я этого не сделал. Можете ли вы опубликовать образец? – programad

+0

Возможно, вы часто попадаете в базу данных? Я думаю о первом утверждении в методе 'FillChild'. – Christian

ответ

1

Это довольно хорошее время для использования HashTable (Dictionary). Что-то вроде приведенного ниже кода должно помочь.

// Convert the flat list into a hash table with the ID 
    // of the element as the key 
    var dict = allCategories.ToDictionary (i => i.Id); 

    // Group categories by the parent id 
    var parentGrouping = allCategories.Where(c => c.IdCategoriaPai != null).GroupBy(c => c.ParentId); 

    // Since we group the items by parent id, we can find 
    // the parent by id in the dictionary and add the children 
    // that have that particular id. 
    foreach(var groupItem in parentGrouping) 
     if(groupItem.Key != null) 
      dict[(int)groupItem.Key].children.AddRange(groupItem); 

    // Get the root elements. 
    var hierarchicalCategories = allCategories.Where(item => item.IdCategoriaPai == null); 

    // Do what you need to do here. 

Этот код создаст дерево категорий. hierarchicalCategories будет содержать прямые ссылки на корневые элементы (категории, у которых нет родителя), при условии, что ваши данные структурированы таким образом.

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