假设您有一个大型数据集,该数据集可能会或可能不会被可能需要密集计算的数据集元素的特定条件过滤.在未过滤的情况下,将根据该条件的值对元素进行分组-该条件仅计算一次.
但是,在已经进行过滤的情况下,尽管后续代码仍期望看到IEnumerable< IGrouping< TKey,TElement>.集合,执行GroupBy操作没有意义,因为该操作会导致对每个元素第二次重新评估条件.相反,我希望能够创建一个IEnumerable< IGrouping< TKey,TElement>>.通过适当地包装过滤后的结果,从而避免再次评估病情.
除了实现自己的提供IGrouping接口的类之外,还有其他方法可以实现此优化吗?是否存在现有的LINQ方法来支持该方法,从而为我提供IEnumerable< IGrouping< TKey,TElement>结果?还有我没有考虑过的另一种方法吗?
解决方法:
the condition is calculated once
我希望那些钥匙还在附近…
如果您的数据是这样的结构:
public class CustomGroup<T, U>
{
T Key {get;set;}
IEnumerable<U> GroupMembers {get;set}
}
您可以使用以下查询来投影此类项目:
var result = customGroups
.SelectMany(cg => cg.GroupMembers, (cg, z) => new {Key = cg.Key, Value = z})
.GroupBy(x => x.Key, x => x.Value)