.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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д