Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 林克单打vs第一_.net_Linq - Fatal编程技术网

.net 林克单打vs第一

.net 林克单打vs第一,.net,linq,.net,Linq,LINQ: 当我确信查询将返回一条记录时,在First()上使用Single()操作符是否更有效 有区别吗?如果我记得的话,Single()检查第一个元素之后是否有其他元素(如果是这样的话,则抛出异常),而first()在获取它后停止。如果序列为空,两者都会引发异常 就个人而言,我总是使用First()。如果Single发现多条记录与条件匹配,它将抛出异常。 First将始终从列表中选择第一条记录。如果查询只返回1条记录,则可以使用First() 如果集合为空,两者都将抛出invalidoOpe

LINQ:

当我确信查询将返回一条记录时,在
First()
上使用
Single()
操作符是否更有效

有区别吗?

如果我记得的话,Single()检查第一个元素之后是否有其他元素(如果是这样的话,则抛出异常),而first()在获取它后停止。如果序列为空,两者都会引发异常


就个人而言,我总是使用First()。

如果Single发现多条记录与条件匹配,它将抛出异常。
First将始终从列表中选择第一条记录。如果查询只返回1条记录,则可以使用
First()

如果集合为空,两者都将抛出
invalidoOperationException
异常。
或者,您可以使用
SingleOrDefault()
。如果列表为空,则不会引发异常

如果您不特别希望在有多个项的情况下引发异常,请使用
First()

这两种方法都是有效的,以第一项为例
First()
的效率稍高一些,因为它不需要检查是否有第二项


唯一的区别是
Single()
希望枚举中只有一个项作为开始,如果有多个项,则会抛出异常。如果您特别希望在这种情况下引发异常,可以使用
.Single()

它们是不同的。它们都断言结果集不是空的,但single也断言结果集不超过1个。我个人使用Single的情况是,我只希望有一个结果,因为返回多个结果是错误的,可能应该这样处理。

这两种方法之间存在细微的语义差异

使用
Single
从应该包含一个元素而不是更多元素的序列中检索第一个(也是唯一的)元素。如果序列中有多个on元素,则调用
Single
将导致引发异常,因为您指出应该只有一个元素

使用
First
从可以包含任意数量元素的序列中检索第一个元素。如果序列中有多个on元素,则调用
First
不会引发异常,因为您指示只需要序列中的第一个元素,而不关心是否存在更多元素

如果序列中不包含任何元素,则两个方法调用都会引发异常,因为两个方法都希望至少有一个元素出现。

如果您希望有一条记录,那么最好在代码中显式显示。 我知道其他人已经写了为什么你使用一个或另一个,但我想我应该说明为什么你不应该使用一个,当你是指另一个时

注意:在我的代码中,我通常会使用
FirstOrDefault()
SingleOrDefault()
,但这是一个不同的问题

例如,一个使用复合键(
ID
Lang
)以不同语言存储客户的表:

上面的代码引入了一个可能的逻辑错误(难以跟踪)。它将返回多个记录(假设您有多种语言的客户记录),但它始终只返回第一个记录。。。这有时可能有用。。。但其他人则不然。这是不可预测的

由于您的目的是返回单个
客户
请使用
Single()

以下内容将引发异常(在本例中,这是您想要的):

然后,你只是打自己的额头,对自己说。。。哎呀!我忘了语言领域!以下是正确的版本:

DBContext db = new DBContext();
Customer customer = db.Customers.Where( c=> c.ID == 5 && c.Lang == "en" ).Single();
First()
在以下场景中很有用:

DBContext db = new DBContext();
NewsItem newsitem = db.NewsItems.OrderByDescending( n => n.AddedDate ).First();
它将返回一个对象,因为您正在使用排序,所以它将是返回的最新记录


当您觉得应该显式地始终返回1条记录时,使用
Single()
可以帮助您避免逻辑错误。

我认识的许多人都使用FirstOrDefault(),但我倾向于更多地使用SingleOrDefault(),因为如果有多条记录,通常会出现某种数据不一致。不过,这是在处理LINQ to对象。

您可以尝试使用简单的示例来获得差异。 异常将在第3行抛出

        List<int> records = new List<int>{1,1,3,4,5,6};
        var record = records.First(x => x == 1);
        record = records.Single(x => x == 1);
List记录=新列表{1,1,3,4,5,6};
var记录=记录。首先(x=>x==1);
记录=记录。单个(x=>x==1);
Single()

返回查询的单个特定元素

使用时:如果恰好需要1个元素;不为0或不超过1。如果列表为空或有多个元素,它将抛出异常“序列包含多个元素”

SingleOrDefault()

返回查询的单个特定元素,如果未找到结果,则返回默认值

使用时:需要0或1个元素时。如果列表中有2个或更多项,它将引发异常

First()

返回具有多个结果的查询的第一个元素

使用时:当需要一个或多个元素,而您只需要第一个元素时。如果列表不包含任何元素,它将引发异常

FirstOrDefault()

返回包含任意数量元素的列表的第一个元素,如果列表为空,则返回默认值

使用时:当需要多个元素,而您只需要第一个元素时。或者列表为空,您需要指定类型的默认值,与
default(MyObjectType)
相同。例如:如果列表类型为
list
,则返回列表中的第一个数字;如果列表为空,则返回0。我
DBContext db = new DBContext();
NewsItem newsitem = db.NewsItems.OrderByDescending( n => n.AddedDate ).First();
        List<int> records = new List<int>{1,1,3,4,5,6};
        var record = records.First(x => x == 1);
        record = records.Single(x => x == 1);
var q = TestTables.First(x=>x.Info == "314638") ;
//Vs.
Var q = TestTables.Single(x=>x.Info =="314638") ; //(this was slightly faster to my surprise)
Employee.Single(e => e.Employeeid == 1)
Employee.Single(e => e.Firstname == "Robert")
Employee.Single(e => e.Employeeid == 10)
Employee.OrderBy(e => e. Birthdate)
.First(e => e.Firstname == "Robert")
Employee.OrderBy(e => e. Birthdate)
.First(e => e.Employeeid == 10)