LINQ学习系列-----3.1 查询非泛型集合和多个分组
一.查询非泛型集合
1.问题起源
LINQ to object在设计时,是配合IEnumerable<T>接口的泛型集合类型使用的,例如字典、数组、List<T>等,但是对于继承了IEnumerable的非泛型集合如何处理,例如ArrayList。
2.解决办法
上源码:
ArrayList mArrayList = new ArrayList() {"","1dsadsad","12w1212","1212e12esadq" };
var query = from m in mArrayList.Cast<string>()
where m.Length >
select m;
foreach (var item in query)
{
Console.WriteLine(item.ToString());
}
Console.Read();
Cast操作符是解决此问题的关键。
public static IEnumerable<T> Cast<T>( this IEnumerable source);
解析:
1.从上述代码可以看出,Cast是一个扩展的方法,返回值是IEumerable<T>,Cast的原对象是IEnumerable,针对实现了IEnumerable接口的对象进行扩展。
2.Cast操作符将源序列中的每个元素转型为某一指定的类型:T
3.Cast操作符通过一次遍历源序列中的元素来返回一个可被枚举的对象,当其他代码开始遍历Cast操作的返回结果时,Cast操作符同时开始遍历源序列,转换为T类型,依次返回。
3.OfType
除了Cast操作符之外,我们还可以使用OfType操作符,差别在于OfType操作符只会返回源序列中属于某种特定类型的元素,例如:
ArrayList中同时包含有Book和Student两种不同的类型的对象时,调用ArrayList.OfType<Book>() 将只会返回Book对象。
二.多个分组条件
1.概述
为了实现这个目标,我在group子句中需要指定一个匿名类型
var query=from book in Samp.Books
group book by new
{
book.Publish,
book.Title
}
解析:
上述查询的是一个集合,其中的每一个元素都是一个分组,每个分组都会包含一个Key(即该匿名类型的一个实例),以及满足该Key的图书集合。
2.再次巩固
上源码:
var query2 = from book in SampleData.booksArray
group book by new { book.Publisher, book.Title } into BookGroup
select new
{
publishName=BookGroup.Key.Publisher.Name,
title=BookGroup.Key.Title
};
foreach (var item in query2)
{
Console.WriteLine(item.publishName+"; "+item.title);
}
这里引入into的目的在于接下来select 和其他子句进行使用,into关键词后的BookGroup变量包含了该组的Key,以及该组中的元素。
Key表示分组的依据,每组中包含的元素则可以通过变量BookGroup变量(该变量实现了IEnumerable<T>接口)得到
源代码: LINQ查询非泛型集合和分组查询测试源码
本文为学习《LINQ实战》总结。
LINQ学习系列-----3.1 查询非泛型集合和多个分组的更多相关文章
- LINQ学习系列-----3.1 查询非泛型集合
一.问题起源 LINQ to object在设计时,是配合IEnumerable<T>接口的泛型集合类型使用的,例如字典.数组.List<T>等,但是对于继承了IEnumera ...
- Linq查询非泛型集合要指定Student类型(比如List)
#region Linq to 集合查询非泛型集合要指定Student类型 //ArrayList list = new ArrayList(); //li ...
- LINQ学习系列-----2.3 迭代器带来的延迟查询
此篇博文承接上一篇博文: LINQ学习系列-----2.2 迭代器 一.第一次执行 废话不多说,上源码: 执行结果下图: 为什么会这样?其实原因很简单 fro ...
- Linq操作非泛型集合
我们都知道,Linq能查询泛型集合,确切的说是:LINQ能实现查询泛型对象或者实现了IEnumerable.但是,很遗憾的是诸如ArrayList这样的非泛型集合并没有实现IEnumerable.那咋 ...
- LINQ学习系列-----1.3 扩展方法
这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性. 一.扩展方法介绍 废话不多说,先上源码截图: 上图中Ge ...
- C#非泛型集合和泛型集合的超级详解
C# 泛型集合之非泛型集合类与泛型集合类的对应: ArrayList对应List HashTable对应Dictionary Queue对应Queue Stack对应Stack SortedList对 ...
- 笔记:Struts2 Action 非泛型集合元素类型转换
局部类型转换文件 局部类型转换文件的文件名应为 ActionName-conversion.properties,其中 ActionName 是需要替换为 Action 的类名称,后面的 conver ...
- C#-非泛型集合的方法
非泛型集合的类和接口位于System.Collections命名空间 如:列表.队列.位数组.哈希表和字典的集合 ArrayList 动态数组 可被单独索引的对象的有序集合可以使用索引在指定的 ...
- 编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合
建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型.很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看Array ...
随机推荐
- docker使用gitlab持续集成(1)
修改ssh连接端口vi /etc/ssh/sshd_config 写docker-compose.yml文件配置gitlab version: '3' services: gitlab: image: ...
- idea在ssm项目中引入本地的jar
在对应的lib下,右键找到add...,即可
- 5个CSS3技术实现设计增强
层叠样式表(css)是Web设计的一种语言,CSS的下一代版本CSS3已经蓄势待发.你是否可望开始使用它们却又不知从何下手呢?虽然还有一些新属性没有得到官方的确认,但是一些浏览器已经开始支持来自CSS ...
- 【2-SAT】[JSOI2010]满汉全席
感觉方法和题解差不多,但是题解写的好烦啊...也不是烦,就是很复杂 这里建议开一个数组表示当前这个点选或者不选的编号,这样之后自己理思路也会清楚一点 然而我调了一个小时才发现我是Tarjan写错了.. ...
- python 怎么像shell -x 一样追踪脚本运行过程
python 怎么像shell -x 一样追踪脚本运行过程 [root@localhost keepalived]# python -m trace --trace mysql_start.py -- ...
- Html标签学习笔记二
1.常用标签 <a></a>超链接 功能 做链接 :在href属性里面写明指向的地方 做下载:href指向文件(注意:不能下载的文件是因为浏览器可以直 ...
- thinkphp 伪静态
URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行.例 ...
- csp-s模拟9697题解
题面:https://www.cnblogs.com/Juve/articles/11790223.html 96: 刚一看以为是水题,直接等差数列求和就好了,然后发现模数不是质数,还要1e18*1e ...
- 概率dp的迭代方式小结——zoj3329,hdu4089,hdu4035
在推导期望方程时我们常常会遇到dp[i]和其他项有关联,那么这时候我们就难以按某个顺序进行递推 即难以通过已经确定的项来求出新的项 即未知数的相互关系是循环的 但是我们又可以确定和dp[i]相关联的项 ...
- CF 1063B Labyrinth
传送门 解题思路 看上去很简单,\(bfs\)写了一发被\(fst\)...后来才知道好像一群人都被\(fst\)了,这道题好像那些每个点只经过一次的传统\(bfs\)都能被叉,只需要构造出一个一块一 ...