假设您有一个大型数据集,该数据集可能会或可能不会被可能需要密集计算的数据集元素的特定条件过滤。在未过滤的情况下,将根据该条件的值对元素进行分组-该条件仅计算一次。

但是,在进行过滤的情况下,尽管后续代码仍希望看到IEnumerable<IGrouping<TKey, TElement>>集合,但是执行GroupBy操作并导致重新评估条件并没有意义。每个元素第二次。相反,我希望能够通过适当包装经过过滤的结果来创建IEnumerable<IGrouping<TKey, TElement>>,从而避免对该条件进行另一次评估。

除了实现自己的提供IGrouping接口的类之外,还有其他方法可以实现此优化吗?是否存在现有的LINQ方法来支持该方法,从而得到IEnumerable<IGrouping<TKey, TElement>>结果?还有我没有考虑过的另一种方法吗?

最佳答案

条件被计算一次


我希望那些钥匙还在附近...

如果您的数据是这样的结构:

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)

10-07 17:13