1.转换操作符

1.ToArray

从一个类型为T的输入序列创建一个类型为T的数组。

2.ToList

从一个类型为T的序列创建一个类型为T的列表。

3.ToDictionary

从类型为T的序列创建一个类型为<TKey, TSource>的字典,如果该原型包含elementSelector参数,则创建一个类型

<TKey, TElement>的字典。

//
// 第一个原型:
/*Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(
* this IEnumerable<TSource> source,
* Func<TSource, TKey> keySelector);*/
{
Dictionary<int, Employee> eDictionary =
Employee.GetEmployeesArray().ToDictionary(k => k.id);
Employee e = eDictionary[2];
Console.WriteLine("Employee whose id == 2 is {0} {1}",e.firstName,e.lastName);
}

//
//第二个原型:
/* Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(
* this IEnumerable<TSource> source,
* Func<TSource, TKey> keySelector,
* IEqualityComparer<TKey> comparer); //多一个 IEqualityComparer<TKey> 比较功能
*/ /* 第三个原型:
* Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(
* this IEnumerable<TSource> source,
* Func<TSource, TKey> keySelector,
* Func<TSource, TElement> elementSelector);
* 与第一原型相比,多一个元素选择器,Dictionary存储的值就可以不同于输入序列元素的类型。
*/
{
Dictionary<int, string> eDictionary = Employee.GetEmployeesArray()
.ToDictionary(k => k.id,
i => string.Format("{0} {1}", i.firstName, i.lastName)); //elementSelector string name = eDictionary[2];
Console.WriteLine("Employee whose id == 2 is {0}", name);
//Employee whose id == 2 is Willam Gates
}

4.ToLookup

单个键可以存储多个值,它是一对多,不像Dictionary<TKey,TElement>一样是一对一的。Lookup<int,int>Dictionary<int,List<int>>是一样的。

从类型T的输入序列中创建一个类型为<TKey, TSource><TKey, TElement>的查找(Lookup),这里TKey是键的类型,TSource是存储的值类型。

如果Lookup类型为<TKey, TElement>,则存储的值类型为TElement,该类型与序列中元素类型T不同。

//第一个原型
/*ILookup<TKey, TSource> ToLookup<TSource, TKey>(
* this IEnumerable<TSource> source,
* Func<TSource, TKey> keySelector);
*/
{
ILookup<int, Actor> lookup = Actor.GetActors().ToLookup(k => k.birthYear);
//看看是否能找到出生于1964年的人
IEnumerable<Actor> actors = lookup[1964];
foreach (var actor in actors)
Console.WriteLine("{0} {1}", actor.firstName, actor.lastName);
//Keanu Reeves, Sandra Bullock
} //第三种原型
/*ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(
* this IEnumerable<TSource> source,
* Func<TSource, TKey> keySelector,
* Func<TSource, TElement> elementSelector);*/
//允许开发者指定元素选择器,存储值类型与输入序列元素类型不同
{
ILookup<int, string> lookup = Actor.GetActors().ToLookup(k => k.birthYear,
i => string.Format("{0} {1}", i.firstName, i.lastName)); //elementSelector //看看是否能找到出生于1964年的人
IEnumerable<string> actors = lookup[1964];
foreach (var actor in actors)
Console.WriteLine("{0} ", actor);
//Keanu Reeves, Sandra Bullock
}

2.相等操作符

1.SequenceEqual

以并行方式枚举每个序列,使用System.Object.Equals方法比较每个序列中的袁旭。如果这些元素全部相等,并且这两个序列具有相同数量元素,

则返回 true,否则返回 false。

//
/*bool SequenceEqual<TSource>(
* this IEnumerable<TSource> first,
* IEnumerable<TSource> second);*/
{
string[] Presidents = { "Adams", "Arthur", "Buchanan" };
string[] Presidents1 = { "Arthur", "Adams", "Buchanan" };
bool isEquals = Presidents.SequenceEqual(Presidents1);
Console.WriteLine(isEquals); //false
}

3.元素操作符

1.First

返回输入序列第一个元素。

2.FirstOrDefault

返回输入序列第一个元素。如果该序列为空,则返回default(T)。对于引用和可空类型,则默认为null

3.Last

返回一个序列的最后一个元素。

4.LastOrDefault

返回最后一个元素,如果该序列为空,则返回default(T)。对于引用和可空类型,则默认为null

5.Single

只返回单个元素序列中的唯一元素,或者一个匹配谓词的序列中的唯一元素。

6.SingleOrDefault

只返回单个元素序列中的唯一元素,如果该序列为空,则返回 default(T)。对于引用和可空类型,则默认为null

如果找到了多于一个的元素,则产生 InvalidOperationException异常。

7.ElementAt

返回源序列中指定索引的元素。

                Employee emp = Employee.GetEmployeesArray().ElementAt(3);
Console.WriteLine("{0} {1}",emp.firstName,emp.lastName);

8.ElementAtOrDefault

返回源序列中指定索引的元素。

如果索引小于0或者大于等于序列的元素数量,则返回default(T)。对于引用和可空类型,则默认为null。(与ElementAt的区别)

                Employee emp = Employee.GetEmployeesArray().ElementAtOrDefault(5);
Console.WriteLine(emp == null ? "NULL" : string.Format("{0} {1}", emp.firstName, emp.lastName));
//结果:NULL

3.量词操作符

1.Any

任何元素满足某个条件,则Any返回true。

            //第一原型:
/*Any<TSource>(
* this IEnumerable<TSource> source);
* 如果 source 序列包含任何元素,则 Any 返回 true。
*/ //第二原型:
/*bool Any<TSource>(
* this IEnumerable<TSource> source,
* Func<TSource, bool> predicate);
* 如果 predicate 返回 ture,则 Any 返回True。
*/
{
string[] Presidents ={
"Adams", "Arthur", "Buchanan", "Bush", "Carter", "Cleveland",
"Clinton", "Coolidge", "Eisenhower", "Fillmore", "Ford", "Garfield",
"Grant", "Harding", "Harrison", "Hayes", "Hoover", "Jackson",
"Jefferson", "Johnson", "Kennedy", "Lincoln", "Madison", "Mckinley",
"Monroe", "Nixon", "Pierce", "polk", "Reagan", "Roosevelt", "Taft",
"taylor", "Trumanyler", "Van Buren", "Washington", "Wilson"
};
bool any = Presidents.Any(); //true
bool anyPredicate = Presidents.Any(s=>s.StartsWith("Z")); //false
}

2.All

所有元素都满足某个条件,则返回True。

bool all = Presidents.All(s => s.Length > 5);
Console.WriteLine(all);//false,不是所有元素长度都大于5

3.Contains

是否包含元素,则返回 true。

5.聚合操作符

1.Count

返回元素中序列的数量。

2.LongCount

long型整数返回输入序列的元素。

3.Sum

返回序列的元素中包含的数字值的总和。

4.Min

返回输入序列中最小值。

//
int[] myInts = new[] {974, 2, 7, 1374, 27, 54}; /*Numeric Min(this IEnumerable<Numeric> source); (Numeric数字类型)*/
int minInt = myInts.Min();
Console.WriteLine(minInt); /*TSource Min<TSource>(this IEnumerable<TSource> source);
* 返回非数字类型*/
string minName = Presidents.Min();
Console.WriteLine(minName); /*Min<TSource>(
* this IEnumerable<TSource> source,
* Func<TSource, Numeric> selector); (Numeric数字类型)
* 用于数字类型,selector委托允许对元素成员变量进行比较 */
int oldeatActorAge = Actor.GetActors().Min(a => a.birthYear);
Console.WriteLine(oldeatActorAge); /*Min<TSource, TResult>(
* this IEnumerable<TSource> source,
* Func<TSource, TResult> selector);
* 用于非数字类型 */
string firstAlphabetically = Actor.GetActors().Min(a => a.lastName);
Console.WriteLine(firstAlphabetically);
/*2
Adams
1960
Bullock*/

5.Max

返回输入序列中最大值。

6.Average

返回序列元素的平均值。

7.Aggregate

对序列每个元素执行开发者指定特定函数,将前一个元素的返回值传入该函数,并返回最后一个元素的返回值。

            //第一种原型:
/* TSource Aggregate<TSource>(
* this IEnumerable<TSource> source,
* Func<TSource, TSource, TSource> func);
* 对每个元素调用func方法委托,将前一个元素返回值传入委托中作为第一个参数,该元素本身作为第二个参数,
* 最后将func返回值存储在一个内部加法器中,然后将该值传递到下一个元素,
* 第一个元素将自身作为输入值传递到 func 方法委托中 */
{
int N = 5;
IEnumerable<int> intSequence = Enumerable.Range(1, N);
foreach (int sequence in intSequence)
{
Console.WriteLine(sequence);
}
//下面计算这个阶乘
//av==乘积,e==元素
int agg = intSequence.Aggregate((av, e) => av*e);
Console.WriteLine("{0}! = {1}",N,agg);
/* 5! = 120*/
} //第二种原型
/*TAccumulate Aggregate<TSource, TAccumulate>(
* this IEnumerable<TSource> source,
* TAccumulate seed, //seed作为第1个参数,而不再是第一个元素本身。
* Func<TAccumulate, TSource, TAccumulate> func);*/
{
IEnumerable<int> intSequence = Enumerable.Range(1,10);
foreach (int item in intSequence)
{
Console.WriteLine(item);
}
Console.WriteLine("----");
int sum = intSequence.Aggregate(1, (s, i) => s + i);
Console.WriteLine(sum);
//56
}

《LINQ技术详解C#》-5.非延迟操作符的更多相关文章

  1. Linq学习总结1--参考Linq技术详解

    2个要点: 1.linq操作的集合必须实现IEnumerable接口,所以在这3.0之前为实现该接口的集合需通过Cast或TypeOf方法转换成可Linq的集合; 2.查询式和Lame那啥表达式都可以 ...

  2. 《LINQ技术详解C#》-4.LINQ到对象

    public static string[] Presidents { get; } = { "Adams", "Arthur", "Buchanan ...

  3. 《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符

    (1)透明标识符 有些翻译步骤要使用透明标识符(*)插入枚举变量. 透明标识符只在翻译过程中存在,翻译结束将不再出现. (2)翻译步骤 ①带有into连续语句的Select和Group语句 from. ...

  4. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  5. Linq之旅:Linq入门详解(Linq to Objects)【转】

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...

  6. Linq之旅:Linq入门详解(Linq to Objects)(转)

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html 示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细 ...

  7. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  8. Comet技术详解:基于HTTP长连接的Web端实时通信技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  9. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

随机推荐

  1. 四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)

    四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml) 转 ...

  2. POJ - 3279 Fliptile (枚举)

    http://poj.org/problem?id=3279 题意 一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最 ...

  3. C++ 输入输出八进制、十进制、十六进制

    默认进制 cin or cout在默认情况下按照十进制输入输出 八进制 要使输入为八进制数,首先切换至八进制输入 cin >> oct; //接下里就可以输入八进制数了 cin >& ...

  4. html5 实时监听输入框值变化的完美方案:oninput & onpropertychange

    结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化. H5手机端: <input type="text" ...

  5. MySQL - 日常操作二 备份还原

    登录mysql的命令 # 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 mysql -h 110. -P3306 -uroot -p mysql -uroot -p -S /dat ...

  6. pyqt5-布局控件

    在布局中添加控件用addWidght(),添加布局用addLayout() 垂直布局QVBoxLayout 需要导入  from PyQt5.QtWidgets import QVBoxLayout ...

  7. 3、输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用栈“先进后出”的性质,将链表的值存入到栈里,然后将栈里的值存入到构建好的容器里,最后打印容器. class So ...

  8. 列式数据库~clickhouse 数据同步使用

    一 简介:进一步了解clickhouse二 数据操 1 单机建表 create TABLE aaa (    id UInt32,    uid UInt32,    amount Float64,  ...

  9. 如何调整cell的大小

    一般情况下,我们使用tableview的时候从来没有设置过cell的大小(w,h).位置(x,y)等,而是系统直接给我们自动生成,但是有的时候我们可能会改动cell的大小及位置,比如:在适配ios6跟 ...

  10. 改环境变量改出问题了,vi,ls这些命令都不能用了,怎么办

    1.出现这个问题肯定是以前的基本环境变量都用不了了(大部分情况就是多了一个空格) 解决办法: cd /usr/bin 下执行vi命令  修改环境变量  然后source /etc/profile   ...