【问题标题】:How to filter collection and it`s nested collection at the same time with the same filter?如何使用相同的过滤器同时过滤集合及其嵌套集合?
【发布时间】:2019-12-06 14:38:25
【问题描述】:

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

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

检查一级过滤:

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
}

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

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

【问题讨论】:

  • Check this SO topic 或者您也可以尝试创建扩展方法。第一个选项将需要创建列表的其他副本,也许是重新创建它。如果它始终是 2 级列表,我真的会在循环中进行过滤。保持简单。

标签: c# linq filter collections


【解决方案1】:

如果理解正确,你要找的是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 2021-03-02
    • 2016-02-25
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多