.NET 4.x Удалить из списка родителей не имеющих дочерних элементов - C#
Формулировка задачи:
есть структура класса
так вот в группах могут быть как элементы так и другие группы
как удалить группы в которых нет элементов. причем удалить и с группами выше.
допустим есть дерево
начало|
группа 1||||||||||||||группа 11
группа 2 группа 22|группа221|элемент 2211
группа 3 группа 23|группа231|группа2311
группа 232|группа 2321|элемент23211
группа 2322
эз этого всего нужно удалить все пустые группы без элементов. удалить группу 2, группу 3, группу 11, группу231 и группу 2322
при выполнении такого запроса :
удаляются только группы последние допустим 2322 и группа 11 и группа 2311,а группа 231 останется не удаленной.
как оптимизировать запрос на удаление всех пустых групп из списка
Листинг программы
- public class object
- {
- //id элемента
- public int id{get;set;}
- //имя элемента
- public string name {get;set;}
- //id родителя
- public int parentid{get;set;}
- //флаг показывающий группа это или элемент
- public bool isgroup {get;set;}
- }
Листинг программы
- var it1 = it.Where(b => !b.isgroup || it.Any(child => child.parentid == b.id)).ToList();
Решение задачи: «.NET 4.x Удалить из списка родителей не имеющих дочерних элементов»
textual
Листинг программы
- public class item
- {
- public int id { get; set; }
- public string name { get; set; }
- public int parentid { get; set; }
- public bool isgroup { get; set; }
- public static List<item> getRandomizedItems(int counter)
- {
- Random r = new Random(0);
- var lsti = new List<item>();
- for (int i = 0; i < counter; i++)
- {
- item it = new item();
- it.id = (i) + 1;
- it.name = "but" + it.id;
- if (i >= 10)
- {
- it.parentid = r.Next(50);
- it.isgroup = Convert.ToBoolean(r.Next(2));
- }
- else { it.parentid = 0; it.isgroup = true; }
- lsti.Add(it);
- }
- return lsti;
- }
- }
- class Program
- {
- static List<item> it;
- static StreamWriter swr;
- static List<item> treeItems = new List<item>();
- const int maxSpacesCount = 10;
- static string GetSapces(int currentLength)
- {
- var spaces = String.Empty;
- var counter = maxSpacesCount - currentLength;
- while (counter > 0)
- {
- counter--;
- spaces += " ";
- }
- return spaces;
- }
- static void findChildren(int parentId, int lenth)
- {
- // condition for avoiding loops
- if (lenth > 0)
- {
- var child = it.Where(ch => ch.parentid == parentId).ToList();
- var currCount = lenth-1;
- foreach (var c in child)
- {
- swr.WriteLine(" " + GetSapces(currCount) +
- String.Format("|--id = {0}, isGroup = {1}, name = {2}, parent ID = {3}",
- c.id, c.isgroup, c.name, c.parentid));
- findChildren(c.id, currCount);
- treeItems.Add(c);
- }
- }
- }
- static void Main(string[] args)
- {
- // get 50 item's tree
- it = item.getRandomizedItems(50);
- // get current info about each element in the tree
- using (swr = new StreamWriter("out.txt", false))
- {
- foreach (var i in it)
- {
- swr.WriteLine(String.Format("id = {0}, isGroup = {1}, name = {2}, parent ID = {3}", i.id, i.isgroup, i.name, i.parentid));
- findChildren(i.id, 10);
- }
- }
- // clean after prev. operation
- treeItems = new List<item>();
- using (swr = new StreamWriter("outTree.txt", false))
- {
- findChildren(0, 10);
- }
- // items' id which is in the tree
- foreach (var item in treeItems)
- {
- Console.Write("{0}, ", item.id);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д