【发布时间】:2010-11-04 16:54:19
【问题描述】:
我四处搜索,并没有真正找到一个明确的答案,即您何时想要使用 .First 以及何时想要将 .FirstOrDefault 与 LINQ 一起使用。
-
您想在什么时候使用
.First?只有在没有返回结果的情况下才想捕获异常?var result = List.Where(x => x == "foo").First(); -
你想什么时候使用
.FirstOrDefault?如果没有结果,您何时总是想要默认类型?var result = List.Where(x => x == "foo").FirstOrDefault(); -
那么,Take 呢?
var result = List.Where(x => x == "foo").Take(1);
【问题讨论】:
-
.First和.FirstOrDefault都将谓词作为参数,因此var result = List.Where(x => x == "foo").First();可以重写为var result = List.First(x => x == "foo"); -
别忘了考虑
Single和SingleOrDefault。我讨厌人们使用First,而他们真正的意思是Single; ) -
如果返回多个元素,Single 或 SingleOrDefault 会抛出异常!我认为 FirstOrDefault 在大多数情况下更好!
-
关键是当你期望一个单一的结果时你应该这样说,异常表明你的逻辑失败了。
-
还要考虑使用
.FirstOrDefault()总是给你机会抛出一个更有意义的异常。如果在一个方法中引发了一个序列异常并且有多个.First(),则可能很难辨别哪个语句是问题所在。