【问题标题】:Is there a stricter version of .Single()? [closed].Single() 有更严格的版本吗? [关闭]
【发布时间】:2011-12-12 13:18:43
【问题描述】:

是否有更严格的 .Single() 版本,如果从所述查询返回多个,则会引发异常?我总是可以创建一个扩展方法,但想知道我是否在重新发明已经存在的东西。

【问题讨论】:

  • 确实如此。 .First() 是不做这个检查的版本。
  • 这正是Single 所做的(实际上是与First 的唯一区别)
  • Single() 应该完全做到这一点,如果不是,那么它在您使用的任何 linq 实现中都是一个错误(这不太可能)。有一个 First() 函数,当有多个结果时不应抛出异常。

标签: c# .net linq


【解决方案1】:

Single() 已经抛出 InvalidOperationException 如果结果包含多个元素(或者如果它是空的)。您可能将它与First() 混淆了,如果有多个元素,它不会抛出。

【讨论】:

  • 如果您正在寻找一种抛出当且仅当有多个元素,但在结果为空时仍然有效的方法,请使用SingleOrDefault()
  • 感谢您的评论+所有回答的人。我不确定这个问题是否值得 7 票反对。有时就是这样。 ;-) .SingleOrDefault() 和 .Single() 就像那时一样完美。
【解决方案2】:
【解决方案3】:

Single() 在这种情况下已经抛出 InvalidOperationException。

顺便说一句,这意味着它在幕后运行了足够的代码来尝试获取至少两个元素 - 所以如果成功它可以抛出,这意味着如果你知道只有一个这样的 First() 性能更高项目,或者不在乎。在 Single 是另一种可能性的情况下选择 First() 介于唯一合理的方法和危险的优化之间,具体取决于具体情况。

【讨论】:

    【解决方案4】:

    来自the documentation

    返回序列的唯一元素,如果出现异常则抛出异常 序列中没有一个元素。

    我认为您混淆了SingleFirst,它们的行为方式与您描述的一样。

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多