.NET 4.x Удалить из списка родителей не имеющих дочерних элементов - C#

Узнай цену своей работы

Формулировка задачи:

есть структура класса
Листинг программы
  1. public class object
  2. {
  3. //id элемента
  4. public int id{get;set;}
  5. //имя элемента
  6. public string name {get;set;}
  7. //id родителя
  8. public int parentid{get;set;}
  9. //флаг показывающий группа это или элемент
  10. public bool isgroup {get;set;}
  11. }
так вот в группах могут быть как элементы так и другие группы как удалить группы в которых нет элементов. причем удалить и с группами выше. допустим есть дерево начало| группа 1||||||||||||||группа 11 группа 2 группа 22|группа221|элемент 2211 группа 3 группа 23|группа231|группа2311 группа 232|группа 2321|элемент23211 группа 2322 эз этого всего нужно удалить все пустые группы без элементов. удалить группу 2, группу 3, группу 11, группу231 и группу 2322 при выполнении такого запроса :
Листинг программы
  1. var it1 = it.Where(b => !b.isgroup || it.Any(child => child.parentid == b.id)).ToList();
удаляются только группы последние допустим 2322 и группа 11 и группа 2311,а группа 231 останется не удаленной. как оптимизировать запрос на удаление всех пустых групп из списка

Решение задачи: «.NET 4.x Удалить из списка родителей не имеющих дочерних элементов»

textual
Листинг программы
  1. public class item
  2.     {
  3.         public int id { get; set; }
  4.         public string name { get; set; }
  5.         public int parentid { get; set; }
  6.         public bool isgroup { get; set; }
  7.  
  8.         public static List<item> getRandomizedItems(int counter)
  9.         {
  10.             Random r = new Random(0);
  11.             var lsti = new List<item>();
  12.             for (int i = 0; i < counter; i++)
  13.             {                                
  14.                 item it = new item();        
  15.  
  16.                 it.id = (i) + 1;
  17.                 it.name = "but" + it.id;
  18.                 if (i >= 10)
  19.                 {
  20.                     it.parentid = r.Next(50);
  21.                     it.isgroup = Convert.ToBoolean(r.Next(2));
  22.                 }
  23.                 else { it.parentid = 0; it.isgroup = true; }
  24.                 lsti.Add(it);
  25.             }  
  26.  
  27.             return lsti;
  28.         }      
  29.     }
  30.  
  31.     class Program
  32.     {
  33.         static List<item> it;
  34.         static StreamWriter swr;
  35.         static List<item> treeItems = new List<item>();
  36.         const int maxSpacesCount = 10;
  37.  
  38.         static string GetSapces(int currentLength)
  39.         {
  40.             var spaces = String.Empty;
  41.             var counter = maxSpacesCount - currentLength;
  42.             while (counter > 0)
  43.             {
  44.                 counter--;
  45.                 spaces += "   ";
  46.             }
  47.  
  48.             return spaces;
  49.         }                
  50.  
  51.         static void findChildren(int parentId, int lenth)
  52.         {
  53.             // condition for avoiding loops
  54.             if (lenth > 0)
  55.             {
  56.                 var child = it.Where(ch => ch.parentid == parentId).ToList();
  57.                 var currCount = lenth-1;
  58.                 foreach (var c in child)
  59.                 {
  60.                     swr.WriteLine("    " + GetSapces(currCount) +
  61.                                     String.Format("|--id = {0}, isGroup = {1}, name = {2}, parent ID = {3}",
  62.                                                                          c.id, c.isgroup, c.name, c.parentid));                  
  63.                     findChildren(c.id, currCount);
  64.                     treeItems.Add(c);
  65.                 }
  66.             }
  67.         }          
  68.  
  69.         static void Main(string[] args)
  70.         {
  71.             // get 50 item's tree
  72.             it = item.getRandomizedItems(50);
  73.  
  74.             // get current info about each element in the tree
  75.             using (swr = new StreamWriter("out.txt", false))
  76.             {
  77.                 foreach (var i in it)
  78.                 {
  79.                     swr.WriteLine(String.Format("id = {0}, isGroup = {1}, name = {2}, parent ID = {3}", i.id, i.isgroup, i.name, i.parentid));
  80.                     findChildren(i.id, 10);                    
  81.                 }
  82.             }
  83.  
  84.             // clean after prev. operation
  85.             treeItems = new List<item>();
  86.             using (swr = new StreamWriter("outTree.txt", false))
  87.             {
  88.                 findChildren(0, 10);
  89.             }
  90.  
  91.             // items' id which is in the tree
  92.             foreach (var item in treeItems)
  93.             {
  94.                 Console.Write("{0}, ", item.id);                        
  95.             }
  96.          }
  97.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы