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 ...
随机推荐
- 7-MySQL高级-主从-1
1. 主从同步的定义 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave). 因为复制是异步进行的,所 ...
- Activiti学习笔记4 — 流程实例化
1.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 2.启动流程 流程 ...
- VSCode 常用setiings.json设置
{ , , "editor.multiCursorModifier": "ctrlCmd", "editor.snippetSuggestions&q ...
- yii2 返回json和文件下载
JSON 調用的控制器返回 json格式的數據即可,對json裡面的數據沒有要求 如在控制器中添加一個方法: public function actionRemoveImage($id){ Yii:: ...
- Erlang学习记录:app demo
目录结构 │ Emakefile │ make.bat │ start.bat ├─config │ config.config │ server.app ├─ebin │ wulin_app.bea ...
- 记一次付工解决Sqlserver问题的过程
问题:Sqlserver连接不上 1 检查自身 Sqlserve服务是否开启 Windows服务是否开启 2 用CMD尝试连接Sqlserver 显示详细错误 由于文件不可访问,或者内存或磁盘空间不 ...
- Java 虚拟机 - 2.3 HotSpot虚拟机对象
对象的创建 Step1 类加载检查 当发现一条new指令时,检查: 该指令的参数是否能在常量池中定位到一个类的符号引用: 并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,那必须先 ...
- Java 基础 - 装箱, 拆箱
总结 1-装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的.(xxx代表对应的基本数据类型).例如:在装箱的时候自动调用的是Integer的 ...
- 基于标记的分水岭分割算法/OpenCV中距离变换
Opencv分水岭算法——watershed自动图像分割用法 OpenCV距离变换distanceTransform应用 图像分割作为图像识别的基础,在图像处理中占有重要地位,通常需要在进行图像分割算 ...
- springMVC 400 错误
1. 今天发现一个奇葩的问题, springMVC出现400错误, 查了很久发现是因为一个参数为int型,而前台传得是String. 这是bug么.