[.net] LINQ Single vs First


Answers

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

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

Question

LINQ:

当我确定查询将返回单个记录时,是否比First()更有效率地使用Single()运算符?

有区别吗?




单()

返回查询的单个特定元素

使用时 :如果预计只有1个元素; 不是0或大于1.如果列表为空或具有多个元素,则会抛出异常“序列包含多个元素”

的SingleOrDefault()

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

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

第一()

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

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

FirstOrDefault()

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

使用时 :预计有多个元素时,只需要第一个元素。 或者列表是空的,你想要一个指定类型的默认值,与default(MyObjectType)相同。 例如:如果列表类型是list<int> ,它将返回列表中的第一个数字,如果列表为空,则返回0。 如果它是list<string> ,它将返回列表中的第一个字符串,如果列表为空,则返回null。




他们是不同的。 他们都声称结果集不是空的,但是单个也声明结果不会超过1个。 我个人使用单一的情况下,我只希望有1结果只是因为获得超过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);



如果您没有特别需要在存在多个项目的情况下引发异常,请使用First()

两者都是高效的,拿第一个项目。 First()稍微高效一些,因为它不会检查是否有第二个项目。

唯一的区别是Single()期望在枚举中只有一个项目开始,如果有多个项目,将会抛出异常。 如果在这种情况下特别需要引发异常 使用 .Single()




Links



Tags

.net .net   linq