首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为链接查询伪造IGrouping

为链接查询伪造IGrouping
EN

Stack Overflow用户
提问于 2009-07-08 20:45:54
回答 3查看 2.4K关注 0票数 3

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

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

除了实现我自己的提供IGrouping接口的类之外,还有没有其他方法可以实现这种优化?有没有现有的LINQ方法支持这一点,从而给出IEnumerable<IGrouping<TKey, TElement>>结果?有没有其他我没有考虑过的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-08 21:08:47

David B's answer的启发,我想出了一个简单的解决方案。如此简单,以至于我都不知道我是如何错过它的。

为了执行过滤,我显然需要知道我正在过滤的条件的值。因此,在给定条件c的情况下,我可以将过滤后的列表投影为:

代码语言:javascript
复制
filteredList.GroupBy(x => c)

这避免了对元素(由x表示)上的任何属性进行重新计算。

我意识到的另一个可行的解决方案是颠倒查询的顺序,并在执行过滤之前执行分组。这也意味着条件只会被评估一次,尽管它会不必要地分配我随后不会使用的分组。

票数 2
EN

Stack Overflow用户

发布于 2009-07-08 21:00:42

条件计算一次

我希望那些钥匙还在某个地方。

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

代码语言:javascript
复制
public class CustomGroup<T, U>
{
  T Key {get;set;}
  IEnumerable<U> GroupMembers {get;set} 
}

您可以使用如下查询来投影这些项:

代码语言:javascript
复制
var result = customGroups
  .SelectMany(cg => cg.GroupMembers, (cg, z) => new {Key = cg.Key, Value = z})
  .GroupBy(x => x.Key, x => x.Value)
票数 3
EN

Stack Overflow用户

发布于 2009-07-08 20:56:28

把结果放到LookUp中,然后在剩下的时间里使用它,怎么样?

代码语言:javascript
复制
var lookup = data.ToLookUp(i => Foo(i));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1100461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档