我已经四处搜索,并没有真正找到一个明确的答案,你什么时候想要使用.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()
是你更好的选择。
但我想这也是个人偏好。使用对您更有意义的东西,更好地适应您的编码风格。