协慌网

登录 贡献 社区

何时使用。第一次以及何时使用. FirstOrDefault 和 LINQ?

我已经四处搜索,并没有真正找到一个明确的答案,你什么时候想要使用.First当你想要使用.FirstOrDefault和 LINQ 时。

  • 你什么时候想要使用.First ?只有当你想要在没有返回结果的情况下捕获异常时?

    var result = List.Where(x => x == "foo").First();
  • 你什么时候想使用.FirstOrDefault ?如果没有结果,你总是想要默认类型?

    var result = List.Where(x => x == "foo").FirstOrDefault();
  • 就此而言,拿什么?

    var result = List.Where(x => x == "foo").Take(1);

答案

当我知道或期望序列至少有一个元素时,我会使用First() 。换句话说,当序列为空时出现异常情况。

当您知道需要检查是否存在元素时,请使用FirstOrDefault() 。换句话说,当序列为空时是合法的。您不应该依赖异常处理来进行检查。 (这是不好的做法,可能会伤害表现)。

最后,之间的差异First()Take(1)是, First()返回元素本身,而Take(1)返回包含恰好一个要素元素的序列。

当没有结果时, .First会抛出异常。 .FirstOrDefault不会,它只返回 null(引用类型)或值类型的默认值。 (例如对于 int 来说就像0一样。)这里的问题不是你想要的默认类型,而是更多:你是否愿意处理异常或处理默认值?由于异常应该是例外情况, FirstOrDefault当您不确定是否要从查询中获得结果时,首选FirstOrDefault 。当逻辑上数据应该存在时,可以考虑异常处理。

在结果中设置分页时,通常使用Skip()Take() 。 (如显示前 10 个结果,下一页显示下 10 个,等等)

希望这可以帮助。

如果没有要返回的行,则 first()将抛出异常,而. FirstOrDefault()将返回默认值(所有引用类型为NULL )。

因此,如果您已做好准备并愿意处理可能的异常,那么.First()就可以了。如果你更喜欢检查!= null 的返回值,那么.FirstOrDefault()是你更好的选择。

但我想这也是个人偏好。使用对您更有意义的东西,更好地适应您的编码风格。