简体   繁体   English

C#中的嵌套对象过滤

[英]Nested Object Filtering in C#

I have collection of menu object and each menu object can have multiple child menus and that can also have multiple child menus and so on. 我有菜单对象的集合,每个菜单对象可以有多个子菜单,也可以有多个子菜单,依此类推。

MenuID
MenuName
IsActive
Children
       MenuID
       MenuName
       IsActive
       Children
               MenuID
               MenuName
               IsActive
               Children

I want to filter only active menus. 我只想过滤活动菜单。 How to do this? 这个怎么做?

I Tried with recursive but no luck. 我尝试递归但没有运气。

private void FilterDeletedRecord(List<Menu> menus)
        {
            if (menus != null && menus.Count > 0)
            {
                foreach (Menu item in menus)
                {
                    if (item.Children != null && item.Children.Count > 0)
                    {
                        item.Children = item.Children.Where(x => !x.IsDeleted).ToList();
                        if (item.Children != null && item.Children.Count > 0)
            {
                            foreach (Menu m in item.Children)
                            {
                                if (m.Children != null && m.Children.Count > 0)
                                {
                                    FilterDeletedRecord(m.Children);
                                }
                            }
            }
                    }
                }
            }
        }

Add new Property to your Menu Class and use it: 将新属性添加到菜单类并使用它:

public class Menu
{
    //Other Memebrs

    public IEnumerable<Menu> ActiveMenus
    {
        get
        {
            return Childeren?.Where(s => !s.IsDeleted);
        }
    }
}

You could try this; 您可以尝试一下;

    IEnumerable<Menu> GetActiveMenus(Menu menu)
    {
        if (menu.IsActive)
        {
            yield return menu;
        }
        if (menu.Children == null)
        {
            yield break;
        }
        foreach (var child in menu.Children)
        {
            foreach (var item in GetActiveMenus(child))
            {
                yield return item;
            }
        }
    }

It returns only the menus whose IsActive property is true. 它仅返回IsActive属性为true的菜单。 If you are not interested in returning the "IsActive" menus you can change what this method returns by adjusting the logic in the if(menu.IsActive) line. 如果您不希望返回“ IsActive”菜单,则可以通过调整if(menu.IsActive)行中的逻辑来更改此方法返回的内容。

If you want to test it I created this console application; 如果要测试它,我创建了这个控制台应用程序。

using System;
using System.Collections.Generic;

namespace ConsoleApplication26
{
    class Program
    {
        static void Main(string[] args)
        {
            var menu = new Menu
            {
                MenuID = 0,
                IsActive = false,
                Children =
                    new List<Menu>
                    {
                        new Menu
                        {
                            MenuID = 2,
                            IsActive = true,
                            Children =
                                new List<Menu>
                                {
                                    new Menu {MenuID = 4, IsActive = true},
                                    new Menu {MenuID = 5, IsActive = false}
                                }
                        },
                        new Menu
                        {
                            MenuID = 3,
                            IsActive = true,
                            Children =
                                new List<Menu>
                                {
                                    new Menu
                                    {
                                        MenuID = 12,
                                        IsActive = false,
                                        Children =
                                            new List<Menu>
                                            {
                                                new Menu {MenuID = 7, IsActive = true},
                                                new Menu {MenuID = 8, IsActive = false}
                                            }
                                    },
                                    new Menu {MenuID = 11, IsActive = true}
                                }
                        }
                    }


            };

            var activeMenus = GetActiveMenus(menu);
            foreach (var activeMenu in activeMenus)
            {
                Console.WriteLine(activeMenu.MenuID);
            }
            Console.ReadLine();
        }

        static IEnumerable<Menu> GetActiveMenus(Menu menu)
        {
            if (menu.IsActive)
            {
                yield return menu;
            }
            if (menu.Children == null)
            {
                yield break;
            }
            foreach (var child in menu.Children)
            {
                foreach (var item in GetActiveMenus(child))
                {
                    yield return item;
                }
            }
        }

    }

    class Menu
    {
        public string MenuName { get; set; }
        public bool IsActive { get; set; }
        public int MenuID { get; set; }
        public IEnumerable<Menu> Children { get; set; }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM