咨询区

  • Shlomo

.ToLookup<TSource, TKey> 返回的是 ILookup<TKey, TSource>, 但我发现 ILookup<TKey, TSource>  同时也实现了 IEnumerable<IGrouping<TKey, TSource>> 接口。

.GroupBy<TSource, TKey> 直接返回的是 IEnumerable<IGrouping<Tkey, TSource>> 接口。

ILookup 有一个方便的属性索引器,所以它具有像字典一样的行为,但 GroupBy 却不能,所以用起来很痛苦,唯一的方式就是通过 foreach 对其进行迭代,换句话说,GroupBy 能做的,貌似 ToLookup 都能很好的完成。

总之,给我的疑惑就是,有了 ToLookup() 是不是 GroupBy() 就没用武之地了?

回答区

  • Allon Guralnek

这两者是类似的,但它们的应用场景完全不一样, .ToLookup() 方法返回的是所有已经分好组的可立即使用的对象,简而言之就是 立即加载, 可参考其源码:

public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{return Lookup<TKey, TSource>.Create(source, keySelector, IdentityFunction<TSource>.Instance, null);
}internal static Lookup<TKey, TElement> Create<TSource>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
{if (source == null){throw Error.ArgumentNull("source");}if (keySelector == null){throw Error.ArgumentNull("keySelector");}if (elementSelector == null){throw Error.ArgumentNull("elementSelector");}Lookup<TKey, TElement> lookup = new Lookup<TKey, TElement>(comparer);foreach (TSource item in source){lookup.GetGrouping(keySelector(item), create: true).Add(elementSelector(item));}return lookup;
}

可以看到,它里面已经执行了 foreach 操作。

.GroupBy() 它仅仅是构建了一个可迭代类,所以它是一个懒加载操作,参考如下源码:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{return new GroupedEnumerable<TSource, TKey, TSource>(source, keySelector, IdentityFunction<TSource>.Instance, null);
}public GroupedEnumerable(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
{if (source == null){throw Error.ArgumentNull("source");}if (keySelector == null){throw Error.ArgumentNull("keySelector");}if (elementSelector == null){throw Error.ArgumentNull("elementSelector");}this.source = source;this.keySelector = keySelector;this.elementSelector = elementSelector;this.comparer = comparer;
}

针对数据库的 Linq To Database 来说, GroupBy() 会被解析成 sql 中的 group by 关键词,所以它会在server端被执行而不是在客户端,因此如果你想在 group key 上做一些过滤条件,比如: (having),这是完全支持的,相关 Tolookup() 是将所有的数据加载到 client 内存中,然后在内存中做 groupby 操作,所以刚才说的附加过滤操作是无法支持的。

点评区

其实说的再多,一看源码就什么都知道了,所以说 ILSpy,Reflector,Dnspy 随身备着哈。

ToLookup 和 GroupBy 到底有什么不同?相关推荐

  1. LINQ 学习路程 -- 查询操作 GroupBy ToLookUp

    Grouping Operators Description GroupBy GroupBy操作返回根据一些键值进行分组,每组代表IGrouping<TKey,TElement>对象 To ...

  2. 从LINQ开始之LINQ to Objects(上)

    LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LIN ...

  3. Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?

    Stored Procedure 里的 WITH RECOMPILE 到底是干麻的? 原文:Stored Procedure 里的 WITH RECOMPILE 到底是干麻的? 在 SQL Serve ...

  4. C# 中奇妙的函数 -- 1. ToLookup

    这个系列,我和大家一起来学学C#中一些非常有用函数,对于有些人来说可能它们不起眼,因此常常忽略它们.它们不会嚷嚷到:"使用我吧!我会让你节省很多的时间,而且让你的代码变得更加的简洁!&quo ...

  5. 一起谈.NET技术,C# 中奇妙的函数之ToLookup

    我将和大家一起来学学C#中一些非常有用函数,对于有些人来说可能它们不起眼,因此常常忽略它们.它们不会嚷嚷到:使用我吧!我会让你节省很多的时间,而且让你的代码变得更加的简洁! -- 但是,这些话会从对它 ...

  6. 利用python进行数据分析——使用groupby机制对pandas对象类的数据进行聚合与分组操作

    文章目录 数据聚合与分组操作 一.GroupBy机制 1.1遍历各分组 1.2选取一列或所有列的子集 1.3 通过字典或Series进行分组 1.4 通过函数进行分组 1.5根据索引层级分组 二. 数 ...

  7. 豆瓣爬虫实战——Angelababy到底是什么风评

    豆瓣爬虫实战--Angelababy到底是什么风评 研究目的 大体思路 操作 1.数据获取 (1)首先是提取所有的电影信息,做成一个表. (2)再获取一些比较细节的节目内容 (3)用筛选出来的电影/电 ...

  8. 潘粤明的《龙岭迷窟》到底怎么样?我用 Python 得出了一些结论!

    对于天下霸唱的鬼吹灯,相信很多小伙伴都知道,它可谓是国内盗墓寻宝系列小说的巅峰之作,最近得知该系列小说的<龙岭迷窟>部分被制作成了网剧,已经于 4 月 1 日开播了,主要演员潘粤明.姜超. ...

  9. drop table可以删除多张表吗_python全球疫情分析,告诉你海外疫情到底有多严峻 | 附290行代码...

    点击蓝字关注!设置星标!每天都有进步 作者:数据小斑马 | 数据分析师 CSDN博客专家 本文通过python,对全球疫情进行分析,除了总结疫情现状外,重点讲解 串联爬虫.数据库和数据分析的基础知识点 ...

最新文章

  1. fastq质量值_fastq格式文件处理大全(四)
  2. ubuntu 13.04 gnome terminal打开默认最大化方法
  3. python 函数参数前面两个星号_Python中参数前面一个星号两个星号(*参数,**参数)起什么作用呢?...
  4. Docker镜像(image)详解
  5. 模型算法_推荐算法之隐语义模型
  6. 有图形化显示,继承WebControl类
  7. [笔记]三维激光SLAM学习——LiDAR里程计原理推导代码实现
  8. MSP430使用wifi模块发送数据(上,测试连接)
  9. 破解版本的Charles
  10. 使用机器学习预测天气_使用机器学习来预测患者是否会再次入院
  11. Python3+Selenium3+Pycharm自动化环境搭建(四):运行unittest时报错,unhandled inspector error
  12. 数字图像处理之matlab实验(三):空间滤波器
  13. excel表格的上传和下载
  14. pstack使用和原理
  15. 如何查看vue打印的console.log日志
  16. trinity的简介、下载及使用
  17. 【51单片机】延时函数计算问题以及如何准确延时
  18. TCP协议之RST与FIN
  19. 数字化驱动全价值链卓越运营
  20. 5G/4G边缘计算网关 智能边缘网关TG463

热门文章

  1. ssh 与 locale
  2. did双重差分法_Stata中双重差分操流程及代码
  3. 《子弹笔记术》[日]杉野干人(作者)epub+mobi+azw3格式下载
  4. CF374 Maxim and Array
  5. JNI中的内存管理(转)
  6. 十个jQuery的幻灯片图片轮播切换插件[转]
  7. Android推送通知指南(转)
  8. android html邮件 messagecompose,android email 转发附件丢失问题
  9. ttl电路制作pong游戏_如何玩Mozilla Firefox的隐藏的独角兽Pong游戏
  10. excel导入csv文件_如何将包含以0开头的列的CSV文件导入Excel