我刚读了一篇SO 帖子,说明FirstOrDefault()返回类型会根据所选元素的值而有所不同.
例:
ICollection<String> list = new List<String>();
list.Add("bye");
int a = (from x in list where (x == "hi") select x.Length).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
在此示例中,a由于int默认值为0 ,因此将等于0.
但是,我可以.Cast<int?>()根据已经链接的帖子追加,以便null在查询返回0结果时获取.
int? a = (from x in list where ... x.Length).Cast<int?>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
为什么我没有得到编译时错误(或至少是一个警告),对于我的第一个例子,我使用Nullable int(int?)而不是常规int?
如果我理解正确,使用int?when执行我的第一个查询将永远不会导致值null.
IEnumerable扩展方法FirstOrDefault没有按照我的意愿完成,所以我创建了FirstOrValue.这是一个很好的方式去做或有更好的方法吗?
public static T FirstOrValue<T>(this IEnumerable<T> source, Func<T, bool> predicate, T value)
{
T first = source.FirstOrDefault(predicate);
return Equals(first, default(T)) ? value : first;
}
Run Code Online (Sandbox Code Playgroud) 当我FirstOrDefault()在整数或布尔值的空列表上使用时,我得到0orfalse而不是null。
我知道这是设计使然,因为它会返回default(T),但我如何强制它返回呢null?
var emptyList = new List<int>();
emptyList.FirstOrDefault() == 0; // I want to receive null instead
Run Code Online (Sandbox Code Playgroud)