如果有可能找不到元素,我应该使用Single()还是SingleOrDefault()?

the*_*row 35 .net c# linq coding-style

你更喜欢看什么?

try
{
  var item = list.Single(x => x.HasFoo);
}
catch(InvalidOperationException e)
{
  throw new InvalidOperationException("Exactly one item with foo expected, none found", e);
}
Run Code Online (Sandbox Code Playgroud)

要么:

var item = list.SingleOrDefault(x => x.HasFoo);
if (item == null)
      throw new InvalidOperationException("Exactly one item with foo expected, none found");
Run Code Online (Sandbox Code Playgroud)

这里的最佳做法是什么?哪一个让异常更容易理解?

aba*_*hev 80

  • SingleOrDefault()如果需要0或1项,请使用
  • 使用Single()如果为1,而不是0或2多,项目预计

还要记住,有许多可能的情况:

  • 当0或1预期时,你得0(ok)
  • 预计0或1时你得到1(ok)
  • 当预期为0或1时,你得到2或更多(错误)

和:

  • 当预期为1时,你得到0(错误)
  • 预计1时你有1(好)
  • 当预期为1时你有2个或更多(错误)

不要忘记First(),FirstOrDefault()Any()

  • 只是添加注释,因为这个答案本身并没有指出问题中的异常代码是错误的; 在第一个片段中,异常应该是"正好有一个foo预期的项目,零或多个被发现" (5认同)

Mys*_*ter 5

我会写:

var item = list.Single(x => x.HasFoo);
Run Code Online (Sandbox Code Playgroud)

如果这不返回单个项目的情况如此常见,您需要一个更友好的错误消息,那么它真的是一个例外吗?