如何按ProductId对List<List<ProductFilter>>求交集并返回ProductFilter?
解决按ProductId求交集并返回ProductFilter对象的问题
当然可行!你现在遇到的编译错误,核心原因是当前代码只提取了ProductId做交集运算,最终得到的是List<int>类型的结果,但Aggregate期望每次迭代的返回类型和初始集合的类型(List<ProductFilter>)一致,所以类型不匹配导致报错。
咱们可以分两步来实现需求:
- 先找出所有子列表中共同存在的ProductId集合
- 根据这些共同的ProductId,从原集合中筛选出对应的
ProductFilter对象
修正后的代码示例
// 第一步:计算所有子列表中共同的ProductId var commonProductIds = groupList.Aggregate( // 初始值取第一个列表的ProductId集合 groupList.First().Select(x => x.ProductId).ToList(), (previousIds, nextList) => previousIds.Intersect(nextList.Select(x => x.ProductId)).ToList() ); // 第二步:从任意一个子列表(这里选第一个)筛选出对应ProductId的ProductFilter var intersectionFilters = groupList.First() .Where(filter => commonProductIds.Contains(filter.ProductId)) .ToList();
额外说明
如果你需要的是所有子列表中属于这些共同ProductId的全部ProductFilter对象(比如同一个ProductId在不同子列表里的过滤项都要保留),可以调整第二步的代码:
var allIntersectionFilters = groupList.SelectMany(list => list.Where(filter => commonProductIds.Contains(filter.ProductId)) ).ToList();
这样就能完美解决类型不匹配的问题,同时精准获取你需要的ProductFilter对象集合啦!
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

