ToLookup 和 GroupBy 到底有什么不同?
咨询区
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 到底有什么不同?相关推荐
- LINQ 学习路程 -- 查询操作 GroupBy ToLookUp
Grouping Operators Description GroupBy GroupBy操作返回根据一些键值进行分组,每组代表IGrouping<TKey,TElement>对象 To ...
- 从LINQ开始之LINQ to Objects(上)
LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. LINQ体系结构 从上图可以看出,LIN ...
- Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?
Stored Procedure 里的 WITH RECOMPILE 到底是干麻的? 原文:Stored Procedure 里的 WITH RECOMPILE 到底是干麻的? 在 SQL Serve ...
- C# 中奇妙的函数 -- 1. ToLookup
这个系列,我和大家一起来学学C#中一些非常有用函数,对于有些人来说可能它们不起眼,因此常常忽略它们.它们不会嚷嚷到:"使用我吧!我会让你节省很多的时间,而且让你的代码变得更加的简洁!&quo ...
- 一起谈.NET技术,C# 中奇妙的函数之ToLookup
我将和大家一起来学学C#中一些非常有用函数,对于有些人来说可能它们不起眼,因此常常忽略它们.它们不会嚷嚷到:使用我吧!我会让你节省很多的时间,而且让你的代码变得更加的简洁! -- 但是,这些话会从对它 ...
- 利用python进行数据分析——使用groupby机制对pandas对象类的数据进行聚合与分组操作
文章目录 数据聚合与分组操作 一.GroupBy机制 1.1遍历各分组 1.2选取一列或所有列的子集 1.3 通过字典或Series进行分组 1.4 通过函数进行分组 1.5根据索引层级分组 二. 数 ...
- 豆瓣爬虫实战——Angelababy到底是什么风评
豆瓣爬虫实战--Angelababy到底是什么风评 研究目的 大体思路 操作 1.数据获取 (1)首先是提取所有的电影信息,做成一个表. (2)再获取一些比较细节的节目内容 (3)用筛选出来的电影/电 ...
- 潘粤明的《龙岭迷窟》到底怎么样?我用 Python 得出了一些结论!
对于天下霸唱的鬼吹灯,相信很多小伙伴都知道,它可谓是国内盗墓寻宝系列小说的巅峰之作,最近得知该系列小说的<龙岭迷窟>部分被制作成了网剧,已经于 4 月 1 日开播了,主要演员潘粤明.姜超. ...
- drop table可以删除多张表吗_python全球疫情分析,告诉你海外疫情到底有多严峻 | 附290行代码...
点击蓝字关注!设置星标!每天都有进步 作者:数据小斑马 | 数据分析师 CSDN博客专家 本文通过python,对全球疫情进行分析,除了总结疫情现状外,重点讲解 串联爬虫.数据库和数据分析的基础知识点 ...
最新文章
- fastq质量值_fastq格式文件处理大全(四)
- ubuntu 13.04 gnome terminal打开默认最大化方法
- python 函数参数前面两个星号_Python中参数前面一个星号两个星号(*参数,**参数)起什么作用呢?...
- Docker镜像(image)详解
- 模型算法_推荐算法之隐语义模型
- 有图形化显示,继承WebControl类
- [笔记]三维激光SLAM学习——LiDAR里程计原理推导代码实现
- MSP430使用wifi模块发送数据(上,测试连接)
- 破解版本的Charles
- 使用机器学习预测天气_使用机器学习来预测患者是否会再次入院
- Python3+Selenium3+Pycharm自动化环境搭建(四):运行unittest时报错,unhandled inspector error
- 数字图像处理之matlab实验(三):空间滤波器
- excel表格的上传和下载
- pstack使用和原理
- 如何查看vue打印的console.log日志
- trinity的简介、下载及使用
- 【51单片机】延时函数计算问题以及如何准确延时
- TCP协议之RST与FIN
- 数字化驱动全价值链卓越运营
- 5G/4G边缘计算网关 智能边缘网关TG463
热门文章
- ssh 与 locale
- did双重差分法_Stata中双重差分操流程及代码
- 《子弹笔记术》[日]杉野干人(作者)epub+mobi+azw3格式下载
- CF374 Maxim and Array
- JNI中的内存管理(转)
- 十个jQuery的幻灯片图片轮播切换插件[转]
- Android推送通知指南(转)
- android html邮件 messagecompose,android email 转发附件丢失问题
- ttl电路制作pong游戏_如何玩Mozilla Firefox的隐藏的独角兽Pong游戏
- excel导入csv文件_如何将包含以0开头的列的CSV文件导入Excel