在空的IEnumerable<int>上使用FirstOrDefault()返回null吗?

34

假设我有以下代码片段:

int? nullableId = GetNonNullableInts().FirstOrDefault();
因为GetNonNullableInts()返回整数,所以FirstOrDefault将默认返回0
是否有方法可以使对整数列表的FirstOrDefault在列表为空时返回null值?
2个回答

60
int? nullableId = GetNonNullableInts().Cast<int?>().FirstOrDefault();

3
有没有办法从FirstOrDefault中定义默认值呢? 当列表返回一组整数时,为了没有实际意义而将它们全部强制转换似乎不是一个好主意。 - Boris Callens
10
Cast() 不会将所有变量都转换 - 它只会按照你枚举的方式进行转换。所以这段代码将只转换零个或一个整数 - 不会对性能造成太大影响。 - Matt Howells
2
你不能定义FirstOrDefault返回的默认值 - 它会返回可枚举集合中的第一个元素,如果不存在,则返回default(T)的结果。 - Matt Howells
3
如果您想要实现FirstOrValue,这里有一篇关于如何正确和错误地实现它的文章:https://dev59.com/tXI-5IYBdhLWcg3wta_w - Eric Lippert
1
@BorisCallens 当你想要给定一个特定的“默认”值时,如果你不想像上面评论中的链接那样创建自己的扩展方法,你可以使用source.DefaultIfEmpty(yourValue).First()。但是这对于改变类型,比如从intint?并不好用,所以它与你的问题不同。 - Jeppe Stig Nielsen
显示剩余2条评论

1

FirstOrDefault 依赖于 IEnumerable<T> 中的 T 来确定返回的类型,这就是为什么你收到的是 int 而不是 int?

因此,在返回任何值之前,您需要将项目转换为 int?,就像 Matt 说的那样


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接