[转] .NET 中关于 First,FirstOrDefault,Single,SingleOrDefault 几个方法的区别

.NET 的 System.Linq.Enumerable 类为我们提供了许多 Linq 方法,今天给大家分享一下关于 First,FirstOrDefault,Single,SingleOrDefault 几个方法的区别,实例及使用场景,首先是关于这几个方法的定义:
First: 返回序列中的第一个元素。
FirstOrDefault: 返回序列中的第一个元素;如果序列中不包含任何元素,则返回默认值。
Single: 返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
SingleOrDefault: 返回序列中的唯一元素;如果该序列为空,则返回默认值;如果该序列包含多个元素,此方法将引发异常。
定义很简单,相信大家看起来没有什么难度,下面通过C#实例来演示具体的用法:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace SingleOrDefaultDemo
 8 {
 9   class Program
10   {
11     static void Main(string[] args)
12     {
13       var lst = new List<int> { 10, 20, 100, 30, 60, 50, 80 };
14
15       //输出结果:10
16       Console.WriteLine("First:{0}", lst.First());
17       //输出结果:10
18       Console.WriteLine("FirstOrDefault:{0}", lst.FirstOrDefault());
19
20       //输出结果:100(注:因为这里的First是按List<int>的索引来取第一个符合条件的元素,所以结果是100,而不是按从小到大的顺序)
21       Console.WriteLine("First:{0}", lst.First(x => x > 30));
22       //输出结果:100(同上First)
23       Console.WriteLine("FirstOrDefault:{0}", lst.FirstOrDefault(x => x > 30));
24
25       // 抛出异常:序列包含一个以上的元素
26       //Console.WriteLine("Single:{0}", lst.Single());
27       // 抛出异常:序列包含一个以上的元素
28       //Console.WriteLine("SingleOrDefault:{0}", lst.SingleOrDefault());
29
30       //抛出异常:序列不包含任何匹配元素
31       //Console.WriteLine("Single:{0}", lst.Single(x => x > 100));
32       //输出结果:0
33       Console.WriteLine("SingleOrDefault:{0}", lst.SingleOrDefault(x => x > 100));
34
35       Console.WriteLine("Press any key to quit...");
36       Console.ReadKey();
37     }
38   }
39 }

运行时的异常截图:

运行结果图:

那么我们什么时候用 First,FristOrDefault,Single,SingleOrDefault 呢?
1.当集合中包含多个元素并想抛出异常时,可以使用 Single 或 SingleOrDefault
2.当集合中不包含任何元素但需要返回默认值时,可以使用 SingleOrDefault
3.无论集合中是否有元素,我们都想要返回一个记录时,可以使用 First 或 FirstOrDefault
4.当集合中不包含任何元素但需要返回默认值时,可以使用 FirstOrDefault

助记:有OrDefault的方法会返回值(如果没有符合条件的元素,则返回默认值),没有OrDefault的方法会抛出异常

FirstOrDefault 与 SingleOrDefault 的性能比较:
FirstOrDefault 通常在性能上会比 SingleOrDefault 表现得比优,因为 FirstOrDefault 是从集合开始位置查找到第一个匹配的元素就返回,而 SingleOrDefault 会迭代集合中所有的元素。

时间: 2024-10-06 02:17:54

[转] .NET 中关于 First,FirstOrDefault,Single,SingleOrDefault 几个方法的区别的相关文章

First,FirstOrDefault,Single,SingleOrDefault的区别

操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回第一个元素 Last 抛异常 返回该元素 返回最后一个元素 LastOrDefault 返回default(TSource) 返回该元素 返回最后一个元素 Single 抛异常 返回该元素 抛异常 SingleOrDefault 返回default(TSource) 返回该元素 抛异常 很明显,如果

hibernate3中session.get()与session.load()两个方法的区别?

1.发送sql的时机不同:load采用延迟加载技术,只有当真正去使用所查处的对象时,才会发送sql:get采用的是立即检索技术,当执行到get方法是就会立即发送sql. 2.返回的对象不同:load返回的是代理对象(这个代理对象由javassist.jar这个包产生):而get返回的是真是对象本身. 3.抛的异常类型不同:当遇到一个不存在的对象时,load会抛ObjectNotFoundException;get会抛NullPointExceprion

关于Linq中First、FirstOrDefault;Single、SingleOrDefault等方法的说明

关于Linq中First.FirstOrDefault:Single.SingleOrDefault等方法的说明 这里以First.FirstOrDefault进行说明,其他类似. 1.First:取序列中满足条件的第一个元素,如果没有元素满足条件,则抛出异常 2.FirstOrDefault:取序列中满足条件的第一个元素,如果没有元素满足条件,则返回默认值(对于可以为null的对象,默认值为null,对于不能为null的对象,如int,默认值为0) 3.Single,返回序列中的唯一一条记录,

Python统计列表中的重复项出现的次数的方法

前言 在实际工作和学习中,经常会遇到很多重复的数据,但是我们又必须进行统计,所及这里简单介绍一下统计列表中重复项的出现次数的简单方法. 实例 本文实例展示了Python统计列表中的重复项出现的次数的方法,是一个很实用的功能,适合Python初学者学习借鉴.具体方法如下: #方法1: mylist = [1,2,2,2,2,3,3,3,4,4,4,4] myset = set(mylist)  #myset是另外一个列表,里面的内容是mylist里面的无重复 项 for item in myset

javascript中利用柯里化函数实现bind方法

柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预先存储的值进行相关的操作处理即可: 柯里化函数主要起到预处理的作用: bind方法的作用:把传递进来的callback回调方法中的this预先处理为上下文context; /** * bind方法实现原理1 * @param callback [Function] 回调函数 * @param con

unity中三种调用其他脚本函数的方法

第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 unity中三种调用其他脚本函数的

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

PHP中获取文件扩展名的N种方法

PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法: function get_extension($file) { substr(strrchr($file, '.'), 1); } 第2种方法: function get_extension($file) { return substr($file, strrpos($file, '.')+1); } 第3种方法: function get_extension($file) { return end(expl

jquery中html 与 text方法的区别

jquery中html 与 text方法的区别 24 May 2012/in 网站设计和开发 /by Bruce 接鉵jquery的时间并不长,以前都是用直接用js写的,现在发现在jquery这个框架用起来很方便,不但代码量少了,使用也比较简单,对于浏览器的兼容问题也不用担心,在使用的过程中也会遇到一些疑问,在html标签中附加子标签时所用的方法html()与text()的区别. 通常在用jquery写ajax时,都会用到html()这个方法,而不用text()这个方法,他们之间有什么区别呢?