Lambda实现以避免这种ForEach Grandad / Dad / Child关系

时间:2016-06-04 16:41:03

标签: linq lambda

我希望过滤具有子/子关系的列表。 我已尝试使用SelectMany / Where / Any来做到这一点,但结果包括不符合儿童状况的列表。

        var filteredGrandadList = new List<Grandad>();

        UnfilteredGrandList.ForEach(grandad =>
        {
            var filteredGrandad = new Grandad
            {
                Id = grandad.Id,
                Name = grandad.Name,
                DadList = new List<Dad>()
            };

            grandad.DadList.ForEach(dad =>
            {
                var filteredDad = new Dad
                {
                    Id = dad.Id,
                    Name = dad.Name,
                    Type = dad.Type,
                    ChildList = new List<Child>()
                };

                dad.ChildList.ForEach(child =>
                {
                    var exists =
                        child.LastName.Equals("Poe")
                    ;

                    if (exists)
                        filteredDad.ChildList.Add(child);
                });

                if (filteredDad.ChildList.Any())
                    filteredGrandad.DadList.Add(filteredDad);
            });

            if (filteredGrandad.DadList.Any())
                filteredGrandadList.Add(filteredGrandad);
        });

有什么想法?.. 提前完成。

1 个答案:

答案 0 :(得分:1)

嗯,可以在一个语句中完成所有操作:

var query = UnfilteredGrandadList.Select(grandad =>
    new Grandad
    {
        Id = grandad.Id,
        // etc
        DadList = grandad.DadList.Select(dad =>
            new Dad
            {
                Id = dad.Id,
                // etc
                ChildList = dad.ChildList
                               .Where(child => child.LastName.Equals("Poe"))
                               .ToList()
            }).Where(dad => dad.ChildList.Any()).ToList()
    }).Where(gd => gd.DadList.Any()).ToList();

因此,对于每个爷爷,你建立一个爸爸序列,其中包含一个过滤的孩子列表(按姓氏过滤),然后过滤该爸爸序列,只包含至少有一个孩子的爸爸,然后转结果列表。

然后,您可以按照父亲列表中至少有一个爸爸(现在至少有一个孩子)的格式过滤生成的爷爷 - 再次将结果序列转换为列表。

这不是很漂亮,不可否认......但我现在无法想到任何清洁......