24

我有一些IEnumberable物品收藏。我用来.Single()在集合中查找特定对象。

我选择使用Single()是因为应该只有一个特定的项目。但是,如果一个不存在,那么我需要创建它并将其添加到集合中。

我的问题是,Single()如果没有与谓词匹配的项目或有多个项目,则会引发相同的错误。我的想法是将Single()调用放在 try 中并捕获异常,添加项目,然后继续。但是,由于这两种情况都会抛出InvalidOperationException,我如何判断它是由于没有项目还是由于多个项目?

我知道我可以使用First(),但这并不能强制认为应该只有一个(无需做额外的工作)。

我也可以Count()Single()通话前使用,但这似乎破坏了Single()

4

3 回答 3

39

你想要的是SingleOrDefault()

“或默认值”实际上意味着它返回 null (对于引用类型)或非引用类型的默认值。你需要新建一个对象来代替它。

于 2012-11-21T17:10:09.553 回答
5

我不建议在这种情况下使用 try/catch,因为使用异常来做出逻辑决策会耗费资源。

我建议使用SingleOrDefault(), 并检查结果是否为空。如果是。做你的创作。

于 2012-11-21T17:10:49.957 回答
1

当集合中有多个项目时,SingleOrDefault 将引发异常。您必须事先手动检查尺寸。

var singleItem = list.Count() == 1 ? list.Single() : null;

也许最好只制作自己的扩展功能。

于 2021-11-09T12:43:08.253 回答