关于c#:我如何处理.FirstOrDefault方法?

How do i handle .FirstOrDefault method?

当我使用.FirstOrDefault方法查询数据库时,如何处理它给我的结果?我特别关注空值,目前我有这样的问题:

1
2
3
4
if (result == default(TypeOfResult))
{
    handleIt();
}

但我不知道这是什么"默认",所以我想知道这样做是否更好:

1
2
3
4
if (result == null)
{
    handleIt();
}

哪一个有效?这到底是什么"违约"?


FirstOrDefault将返回序列中的第一个元素,或者直接返回所讨论类型的默认值。

因此,根据您查询的内容,默认值可能会更改。例如,intdefault值的集合将为0。因此,检查null是否不起作用。

考虑:

1
2
List<int> s = new List<int>();
var x = s.FirstOrDefault();

这里,x等于0

引用类型如何?

1
2
List<MyCustomClass> s = new List<MyCustomClass>();
var x = s.FirstOrDefault();

这里的x就是null

这可能是两种方法中较好的一种:

1
2
3
4
if (result == default(TypeOfResult))
{
   handleIt();
}

如果TypeOfResult是引用类型,则

result == default(TypeOfResult)result == null的意思相同。

因为null中引用类型的默认值。

默认关键字只返回给定类型的"默认值",在null中引用类型的情况下。对于值类型,它取决于类型,例如,对于int等,它是0。

顾名思义,如果集合为空,FirstOrDefault将返回集合的第一个元素或给定类型的默认值。


如果您希望这样做,请确保您的代码可以使用默认值(t)failsave,其中t是一个值类型,您可以将项目框在可为空的对象中。

例如:

1
2
var ints = new List<int>(){1,2,3,4,6};
int result = ints.Where(i => i == 0).FirstOrDefault();

即使列表中没有0,结果也是0!

1
2
3
var ints = new List<int>(){1,2,3,4,6};
var nullable = ints.Select(i => new Nullable<int>(i));
var result = nullable.Where(i => i == 0).FirstOrDefault()

结果为空,列表中没有0!

这当然较慢,需要更多的内存,但也适用于非值类型。


您应该检查为空。如果找不到任何结果,FirstOrDefault将返回空值。

看到这个帖子