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

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

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

есть структура класса
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;}
}
так вот в группах могут быть как элементы так и другие группы как удалить группы в которых нет элементов. причем удалить и с группами выше. допустим есть дерево начало| группа 1||||||||||||||группа 11 группа 2 группа 22|группа221|элемент 2211 группа 3 группа 23|группа231|группа2311 группа 232|группа 2321|элемент23211 группа 2322 эз этого всего нужно удалить все пустые группы без элементов. удалить группу 2, группу 3, группу 11, группу231 и группу 2322 при выполнении такого запроса :
var it1 = it.Where(b => !b.isgroup || it.Any(child => child.parentid == b.id)).ToList();
удаляются только группы последние допустим 2322 и группа 11 и группа 2311,а группа 231 останется не удаленной. как оптимизировать запрос на удаление всех пустых групп из списка

Решение задачи: «.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);                        
            } 
         } 
    }

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


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

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

8   голосов , оценка 4 из 5
Похожие ответы