`
king_tt
  • 浏览: 2100111 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

LINQ学习心得分享--------(三)LINQ语法详解2

 
阅读更多

接着上一节的讲,在这一节我会带领大家把剩余的一些LINQ语法给大家讲解完。好了,废话不多说,进入正题。

1、CastOfType操作符

CastOfType:都用于将一个类型为IEnumerable的集合对象转化为一个类型为IEnumerable<T>的集合对象,两者的功能都是一样的,唯一的区别在于Cast操作符进行类型转换时,如果转换中出现转化失败的情况,则会抛出一个异常,而OfTyoe操作符只是把能够转换的元素转换掉

这里还是用上一节的例子:(该示例参考自Rookie_J博客)

先新建一个ArrayList对象

ArrayListarraylist=newArrayList()

{

newPerson(){Name="Olive",Sex="",Age=18},

newPerson(){Name="Moyao",Sex="",Age=19},

newPerson(){Name="Momo",Sex="",Age=20},

newPerson(){Name="Only",Sex="",Age=21},

newProfession(){Name="Olive",ZhiYe="会计"},

newProfession(){Name="Remote",ZhiYe="ITCoder"},

newProfession(){Name="BLove",ZhiYe="学生"},

newProfession(){Name="AFor",ZhiYe="作家"}

};

Console.WriteLine("人员信息表:");

//arraylist对象转换为IEnumerable<person>对象

IEnumerable<Person>pers=arraylist.OfType<Person>();

foreach(varpinpers)

{

Console.WriteLine("人员信息:"+p.Name+"性别:"+p.Sex+"年龄:"+p.Age);

}

Console.WriteLine("人员职业表:");

//arraylist

IEnumerable<Profession>professions=arraylist.OfType<Profession>();

foreach(varpinprofessions)

{

Console.WriteLine("人员姓名:"+p.Name+"职业:"+p.ZhiYe);

}

结果:

2、DefaultIfEmptyFirstOrDefault、LastOrDefault、SingleOrDefault、ElementAtOrDefault

2.1DefaultIfEmpty:在查询不到所符合要求的信息时,返回一个含有默认元素的序列

IEnumerable<Person>pers=arraylist.OfType<Person>();

vardefaultTest=pers.Where(p=>p.Name=="").DefaultIfEmpty(newPerson(){Name="查无此人"});

foreach(varpindefaultTest)

{

Console.WriteLine("查询结果:"+p.Name);

}

结果:

2.2FirstOrDefault/LastOrDefault:顾名思义,返回输出序列中满足条件的第一(最后一个)元素,如果没有,序列元素类型是引用类型的则返回null,是值类型的则返回该值类型的默认值

PersondefaultTest=pers.Where(p=>p.Name=="Olive").FirstOrDefault();

//foreach(varpindefaultTest)

//{

if(defaultTest!=null)

{

Console.WriteLine("FirstOrDefault查询结果:"+defaultTest.Name+""+defaultTest.Age+""+defaultTest.Sex);

}

else

{

Console.WriteLine("FirstOrDefault查询结果:查无此人!");

}

结果:

如果将PersondefaultTest=pers.Where(p=>p.Name=="").FirstOrDefault();

则结果为:

LastOrDefaultFirstOrDefault使用方法基本上都差不多,只不过LastOrDefault返回的是符合查询条件的序列的最后一个元素,如果没有的符合条件元素则返回默认值。

2.3SingleOrDefault:有点类似于FirstOrDefault如果没有元素则返回一个默认值default(T),但是如果有多个元素则SingleOrDefault操作符还是会抛出异常

例如:

PersondefaultTest=pers.Where(p=>p.Sex=="").SingleOrDefault();

结果:出现了这样的异常,因为查到的符合条件的信息有多个。

PersondefaultTest=pers.Where(p=>p.Name="Olive").SingleOrDefault();

结果:

2.4ElementAtOrDefault:用于返回序列中指定位置的元素,如果指定索引的值不合法,则返回一个相关类型默认值元素

示例:PersondefaultTest=pers.Where(p=>p.Sex=="").ElementAtOrDefault(5);

if(defaultTest!=null)

{

Console.WriteLine("ElementAtOrDefault查询结果:"+defaultTest.Name+""+defaultTest.Age+""+defaultTest.Sex);

}

else

{

Console.WriteLine("ElementAtOrDefault查询结果:查无此人!");

}

结果:

3Range,Repeat

这两个方法均为System.Linq.Enumerable命名空间下Enumerable类的的静态方法,但不是扩展方法,具体使用如下:

3.1Range:只能产生整数序列,且生成的为连续的序列

VarrangeTest=Enumerable.Range(115,6);

Foreach(varrinrangeTest)

{

Console.WriteLine("生成序列元素:"+r);

}

结果:

3.2Repeat:可以产生重复的泛型序列

VarvarrepeatTest=Enumerable.Repeat("Olive",6);//函数参数:1、要重复的元素、2、重复产生的个数

varrangeTest=Enumerable.Range(115,6);

foreach(varrinrepeatTest)

{

Console.WriteLine("Repeat生成序列元素:"+r);

}

结果:

3、延迟执行

延迟执行:查询变量本身只是存储查询命令,不保存查询结果,实际的查询执行会延迟到在foreach语句中循环访问查询变量时发生

varserachtest=frompinpers

wherep.Sex==""

selectp;

foreach(varpinserachtest)

{

Console.WriteLine("人员信息:"+p.Name+"性别:"+p.Sex+"年龄:"+p.Age);

}

结果:

写到这里,可能大家还没有明白什么是执行?当然,在我的学的时候我也没有看明白。

再看下面的例子

int[]yanchishuzu=newint[]{1,2,3,4,5};

varyuan=yanchishuzu.Select(y=>y)

foreach(intiinyuan)

{

Console.WriteLine(i);

}

yanchishuzu[0]=116;

yanchishuzu[1]=116;

yanchishuzu[2]=116;

yanchishuzu[3]=116;

yanchishuzu[4]=116;

foreach(intiinyuan)

{

Console.WriteLine(i);

}

结果:

执行下面代码:

int[]yanchishuzu=newint[]{1,2,3,4,5};

varyuan=yanchishuzu.Select(y=>y).ToList()

foreach(intiinyuan)

{

Console.WriteLine(i);

}

yanchishuzu[0]=116;

yanchishuzu[1]=116;

yanchishuzu[2]=116;

yanchishuzu[3]=116;

yanchishuzu[4]=116;

foreach(intiinyuan)

{

Console.WriteLine(i);

}

结果:

由两次实验结果可知:第一次两次执行后结果不一样,还得上边说过的吗?“查询变量本身只是存储查询命令,不保存查询结果”,在这里就得到了很好的体现,第一查询之后对数据源进行了更新,所以在第二次查询的时候,数据源已经发生了改变,所以查询的结果是不一样的,这种执行方式称为“延迟查询”,实际的查询执行会延迟到在foreach语句中循环访问查询变量时发生,所以当数据源发生变化是能马上做出反应。

第二次实验两次的结果都一样,是因为在查询语句后边多了一个ToList()的方法,该方法是非延迟执行的,也就是马上执行,执行之后返回的是int[]集合来缓存对象,而不是IEnumerable<Int>集合对象,即使这个时候对数据源进行重置,但是Foreach执行循环的对象还是原来的对象,所以结果是不会改变的。

经过这些讲解,你是不是对此有了新的体会呢?是不是有点明白了?下面将常用的LINQ查询的操作方法给列举了出来,从这个表里,你可以很清楚的明白哪些操作方法是延迟的,哪些是非延迟。这样就可以很好运用这一特性,实时的更新显示数据。

Where

过滤;延迟

Select

选择;延迟

Distinct

查询不重复的结果集;延迟

Count

返回集合中的元素个数,返回INT类型;不延迟

LongCount

返回集合中的元素个数,返回LONG类型;不延迟

Sum

返回集合中数值类型元素之和,集合应为INT类型集合;不延迟

Min

返回集合中元素的最小值;不延迟

Max

返回集合中元素的最大值;不延迟

Average

返回集合中的数值类型元素的平均值。集合应为数字类型集合,其返回值类型为double;不延迟

Aggregate

根据输入的表达式获取聚合值;不延迟

4、非延时执行(ToList,ToArray,ToDictionary,SequenceEqual,First,Last,Single,Any,AllContains

4.1ToList/ToArray

ToList:用于将一个输入序列转换成一个类型为List<T>集合对象

ToArray:生成并返回一个元素类型为T的数组

这两个的作用差不多,上边在讲延迟执行的时候,已经举过例子,在这里就不再做示例了。

4.2ToDictionary

4.3FirstLastSingle

First:从输出序列中选择第一元素输出

Last:从输出序列中选择最后一个元素输出

Single用于从输入序列中返回唯一的元素或满足条件的唯一元素,在这里需要特别注意,Single只能用于返回一个元素,如果返回序列有多个元素就会报错

如图:

这三个方法的使用都差不多,在这里只举一个First.

示例:PersondefaultTest=pers.Where(p=>p.Sex=="").First();

结果:

4.3SequenceEqual:用于判断两个序列是否相等

Booltest=list.SequenceEqual(list1);

如果两个序列相等则返回true,不相等则为false

4.4AnyAll

Any用于判断输入序列中所有元素是否都满足指定条件

All判断输入序列中是否含有元素或者含有满足条件的元素

这两方法的结果均为bool类型,通过判断可以所得序列的元素是否满足条件

示例:

boolanyTest=pers.All(p=>p.Sex=="");

if(anyTest)

{

Console.WriteLine("ALL所有的人员不全是男性");

}

else

Console.WriteLine("ALL所有的人员都是男性");

结果:

Any的用法和All的用法差不多,这里就不做示例了。

4.5Contains:判断序列中是否有指定的元素,返回布尔值

示例:

boolanyTest=pers.Select(p=>p.Name).Contains("Olive");

if(!anyTest)

{

Console.WriteLine("Contains不存在所查询的元素!");

}

else

Console.WriteLine("Contains存在所查询的元素!");

结果:

这一节就讲到这里了,主要讲了延迟执行和非延迟执行,希望可以对大家有所帮助,也希望大家多多批评指正,共同探讨,共同进步。下一节我会主要讲LINQTOXML

分享到:
评论

相关推荐

    LINQ_to_SQL语法及实例详解.docx

    LINQ学习的好资料,说明LINQ的各类用法,以及一些示例。

    LINQ To SQL 语法详解

    详细介绍了LINQ的使用.很方便,欢迎大家下载哈

    Linq to Sql语句详解

    Linq to Sql语句详解,讲述了Linq to Sql语法详解,包括Linq to sql的动态语句,和继承的应用。还有在分层结构情况下的应用。

    linq_to_entity_详解(查询)

    对于linq to entity的语法的介绍以北风网为例子

    C#3.0与.net3.5之Linq入门

    本书为linq入门书籍,简单易懂。主要介绍了linq的基本语法及应用。

    Linq两个List集合取交集的实现

    您可能感兴趣的文章:C#中Linq查询基本操作使用实例c#中LINQ的基本用法实例C# linq查询之动态OrderBy用法实例C#中的Linq Intersect与Except方法使用实例C#中的Linq to Xml详解LINQ 标准查询操作符linq语法基础使用...

    详解LINQ入门(中篇)

    感谢大家的支持,本篇我们将更进一步的学习LINQ的一些相关特性及应用方法。废话不多说,请往下阅读吧。 延迟加载 在上篇中简单的和大家提到了LINQ具有一个很有意思的特性那就是“延迟加载”(或“延迟计算”),什么...

    .Net.Framework3.5开发技术详解

    .Net.Framework3.5开发技术详解 完整程度:99%完整 少最后8页 清晰度:一般 格式:PDF 总页数:402 内容简介 《.NET Framework3.5开发技术详解》全面讲解了.NET Framework 3.5开发中各方面的技术要点,共分19章。...

    .Net.Framework3.5开发技术详解[中文][共二卷][PDF][VOL2]

    许多技术人员在面对.NET Framework 3.0/3.5大量的新知识、新技术的时候感到彷徨,对自己现有的技术知识是否过时会产生疑问,对新技术会产生抵触的情绪,其实,只要能学习到真正代表业界趋势的技术,花不太多的时间...

    浪曦个人博客商业版 源码

    环境配置 三层架构搭建 便于换肤的DIV + CSS布局 博文的增删改查 分类管理 生成静态页 支持静态页换肤的实现 微软最新持久层框架LINQ的语法以及与新老版本控件的配合使用详解

    .net core从零开始学习

    .net core 6.0 webapi Resful风格;...Linq语法的使用; 依赖注入; 日志系统Nlog的使用; 缓存的详解,内存缓存,分布式缓存; JWT的基本使用; SignalR的基本介绍,前后端例子的使用; DDD领域驱动设计的简单介绍;

    .Net.Framework3.5开发技术详解[中文][PDF][VOL1]

    许多技术人员在面对.NET Framework 3.0/3.5大量的新知识、新技术的时候感到彷徨,对自己现有的技术知识是否过时会产生疑问,对新技术会产生抵触的情绪,其实,只要能学习到真正代表业界趋势的技术,花不太多的时间...

    亮剑.NET深入体验与实战精要2

    本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、中级开发人员参考...

    关于对mysql语句进行监控的方法详解

    有的持久层框架采用linq的语法来写sql , 程序中不方便输出sq语句 线上运行的程序,没有办法更改程序。但需要确认问题出错在哪里?执行了哪些sql语句。可以根据sql 语句来判断 出错的地方。 如何在m

    亮剑.NET深入体验与实战精要3

    本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、中级开发人员参考...

Global site tag (gtag.js) - Google Analytics