首页 > 解决方案 > 如何使用相同的过滤器同时过滤集合及其嵌套集合?

问题描述

我有收藏,其中有其他收藏。我需要一些优雅的解决方案来解决以下问题:

我需要过滤第一个集合,它是内部集合。因此,在第一个集合中将仅保留具有嵌套集合的对象,这些对象回答了一些过滤器。接下来,我希望在过滤的第一个对象中具有由相同过滤器过滤的内部集合。

检查一级过滤:

collectionOne = collectionOne.Where(a => a.collectionTwo.Any(g => !string.IsNullOrEmpty(g.Value) && g.Value.Contains(stringValue)));

这样我将过滤第一个集合,但内部的仍然不会被过滤。我想为第一个对象中的每个对象使用相同的过滤器过滤内部集合:) 我可以通过一些循环(在第一个过滤器之后)来做到这一点,但也许有更好的方法?

可能的解决方案:

foreach(var item in collectionOne)
{
  item.collectionTwo = ... same filter
}

PS我问这个的原因是因为还有一个关于过滤器本身的开关盒。所以我将不得不使用不同的过滤器复制粘贴解决方案几次。这就是为什么我不喜欢循环。

其他解决方案是创建将在 .Where 子句中重复使用的 Func,但这也不是有效的,因为每个过滤器都很简单。

标签: c#linqfiltercollections

解决方案


如果理解正确,您正在寻找的是:

collectionOne = collectionOne
                    .Where(filter)
                    .Select(item =>
                        {
                            item.collectionTwo = collectionTwo.Where(filter);
                            return item;
                        });

而且,如果您只想选择而不是修改项目:

collectionOne = collectionOne
                    .Where(filter)
                    .Select(item =>
                        new X{
                            collectionTwo = collectionTwo.Where(filter),
                            // copy all other fields
                        });

推荐阅读