一.查询非泛型集合

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 查询非泛型集合和多个分组的更多相关文章

  1. LINQ学习系列-----3.1 查询非泛型集合

    一.问题起源 LINQ to object在设计时,是配合IEnumerable<T>接口的泛型集合类型使用的,例如字典.数组.List<T>等,但是对于继承了IEnumera ...

  2. Linq查询非泛型集合要指定Student类型(比如List)

    #region Linq to 集合查询非泛型集合要指定Student类型            //ArrayList list = new ArrayList();            //li ...

  3. LINQ学习系列-----2.3 迭代器带来的延迟查询

    此篇博文承接上一篇博文: LINQ学习系列-----2.2 迭代器 一.第一次执行                      废话不多说,上源码: 执行结果下图: 为什么会这样?其实原因很简单 fro ...

  4. Linq操作非泛型集合

    我们都知道,Linq能查询泛型集合,确切的说是:LINQ能实现查询泛型对象或者实现了IEnumerable.但是,很遗憾的是诸如ArrayList这样的非泛型集合并没有实现IEnumerable.那咋 ...

  5. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...

  6. C#非泛型集合和泛型集合的超级详解

    C# 泛型集合之非泛型集合类与泛型集合类的对应: ArrayList对应List HashTable对应Dictionary Queue对应Queue Stack对应Stack SortedList对 ...

  7. 笔记:Struts2 Action 非泛型集合元素类型转换

    局部类型转换文件 局部类型转换文件的文件名应为 ActionName-conversion.properties,其中 ActionName 是需要替换为 Action 的类名称,后面的 conver ...

  8. C#-非泛型集合的方法

    非泛型集合的类和接口位于System.Collections命名空间 如:列表.队列.位数组.哈希表和字典的集合     ArrayList 动态数组 可被单独索引的对象的有序集合可以使用索引在指定的 ...

  9. 编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合

    建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型.很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看Array ...

随机推荐

  1. [MtOI2019]幽灵乐团

    题目 一个很暴力的辣鸡做法 考虑到两个数的\(\gcd\)是所有质数次幂取\(\min\),两个数的\(\rm lcm\)是所有质数次幂取\(\max\),于是最后的答案一定是\(\prod p_i^ ...

  2. Harry and magic string HDU - 5157 记录不相交的回文串对数

    题意: 记录不相交的回文串对数 题解: 正着反着都来一遍回文树 用sum1[i] 表示到 i 位置,出现的回文串个数的前缀和 sun2[i]表示反着的个数 ans+=sum1[i-1]*sum2[i] ...

  3. Native API

    https://technet.microsoft.com/en-us/sysinternals/bb897447.aspx http://www.rohitab.com/discuss/topic/ ...

  4. 如何收集项目日志统一发送到kafka中?

    上一篇(http://qindongliang.iteye.com/blog/2354381 )写了收集sparkstreaming的日志进入kafka便于后续收集到es中快速统计分析,今天就再写一篇 ...

  5. git提交流程简述

    1.初始化:一个项目只执行一次 只要有.git隐藏文件夹就ok了 git init 或者 git clone url 2.为远程github仓库生成别名(remote-name就是远程仓库的别名)这一 ...

  6. C# async await 举个栗子

    首先,async 和 await 代表异步执行和等待. async是一个标记,告诉编译器,我可能是一个异步方法. await 代表等待,告诉编译器,这里等我返回结果. 下面,我们简单说一下. 一 , ...

  7. Java 仓储模式

    使用的Spring boot +Jpa 项目层级: common里包含了model,以及一些viewModel等等 下面就是设计的仓储模式 先看下SysUser: @MappedSuperclass ...

  8. CSS——before和after伪元素

    之所以被称为伪元素,是因为他们不是真正的页面元素,html没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用诸如页面元素一样的css样式,表面上看上去貌似是页面的某些元素来展现 ...

  9. JSOI 2008 魔兽地图

    题目描述 DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) ...

  10. 图片压缩(js压缩,底部有vue压缩图片依赖使用的教程链接)

    directTurnIntoBase64(fileObj, callback) { var r = new FileReader(); // 转成base64 r.onload = function( ...