Фильтрация всего иерархического списка с помощью LINQ - PullRequest
1 голос
/ 11 октября 2011

У меня есть простой высокотехнологичный список объектов «Группы товаров» (IQueryable).Каждая группа «ProductGroup» имеет коллекцию групп «Product», называемых «Children», целочисленное поле ParentId и логическое поле «IsEnabled».

public class ProductGroup
{
    public int Id;
    public int ParentId;
    public ICollection<ProductGroup> Children;
    public bool IsEnabled;
}

Я хочу иметь возможность вернуть дерево групп ProductGroups, где «IsEnabled»это правда.

В данный момент, если я делаю

ProductGroups.Where(x => x.IsEnabled)

Это возвращает включенные продукты.Если я делаю

ProductGroups.Where(x => x.ParentId == null)

Это возвращает корни.Я хочу иметь возможность возвращать полное дерево, исключая отключенные элементы, как можно проще (т.е. не использовать циклы for после запроса к коллекции).

ProductGroup1 (IsEnabled == true)
    |
    --------- ProductGroup2 (IsEnabled == true)
    |               |
    |               ----------- ProductGroup4 (IsEnabled == false)
    |
    --------- ProductGroup4 (IsEnabled == false)

т.е. вернуть ProductGroup1 с 1 дочерним элементом ProductGroup2

Спасибо

1 Ответ

0 голосов
/ 11 октября 2011

Я не уверен в ваших точных потребностях с отфильтрованной коллекцией. Я смотрю на это как View-Model. А метод рекурсивного расширения предоставляет вам удобный способ достижения этого фильтра:

public static class Helper
{
    public static ICollection<ProductGroup> EnabledWithChildren(this ICollection<ProductGroup> source)
    {
        var result = new List<ProductGroup>();
        foreach (var ele in source)
        {
            if(ele.IsEnabled == true)
            {
                var productGroup = new ProductGroup{Id = ele.Id, IsEnabled = ele.IsEnabled, ParentId = ele.ParentId};
                if(ele.Children != null && ele.Children.Count() > 0) 
                    productGroup.Children = ele.Children.EnabledWithChildren();
                result.Add(productGroup);
            }
        }
        return result;
    }    
}

И использование:

public class ProductGroup
{
    public int Id;
    public int? ParentId;
    public ICollection<ProductGroup> Children;
    public bool IsEnabled;

    static void Main()
    {
        var filteredProductGroups = ProductsGroups.EnabledWithChildren();
    }
}
...