.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);
}
}
}