LINQ:
当我确定查询将返回一条记录时,使用Single()操作符比First()更有效吗?
有区别吗?
LINQ:
当我确定查询将返回一条记录时,使用Single()操作符比First()更有效吗?
有区别吗?
当前回答
这两种方法在语义上有细微的差别。
使用Single从一个序列中检索第一个(也是唯一一个)元素,该序列应该只包含一个元素。如果序列中有多个元素,则调用Single将导致抛出异常,因为您指示了应该只有一个元素。
使用First从可以包含任意数量元素的序列中检索第一个元素。如果序列中有多个元素,则调用First不会引发异常,因为您表示只需要序列中的第一个元素,而不关心是否存在更多元素。
如果序列不包含元素,两个方法调用都会引发异常,因为两个方法都希望至少有一个元素存在。
其他回答
如果我回忆,Single()检查在第一个元素之后是否有另一个元素(如果是这样,则抛出异常),而first()在得到它之后停止。如果序列为空,两者都会抛出异常。
就我个人而言,我总是使用First()。
我认识的很多人都使用FirstOrDefault(),但我更倾向于使用SingleOrDefault(),因为如果有多个,通常会出现某种数据不一致。不过,这是在处理LINQ-to-Objects。
他们是不同的。它们都断言结果集不是空的,但single也断言结果集不超过1个。我个人在只希望有1个结果的情况下使用Single,因为返回超过1个结果是一个错误,可能应该这样对待。
你可以尝试简单的例子来得到不同。 异常将在第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);
这两种方法在语义上有细微的差别。
使用Single从一个序列中检索第一个(也是唯一一个)元素,该序列应该只包含一个元素。如果序列中有多个元素,则调用Single将导致抛出异常,因为您指示了应该只有一个元素。
使用First从可以包含任意数量元素的序列中检索第一个元素。如果序列中有多个元素,则调用First不会引发异常,因为您表示只需要序列中的第一个元素,而不关心是否存在更多元素。
如果序列不包含元素,两个方法调用都会引发异常,因为两个方法都希望至少有一个元素存在。