我已经四处寻找并且没有真正找到关于何时想要使用.First
以及何时想要使用.FirstOrDefault
LINQ 的明确答案.
你什么时候想用.First
?只有当你想要在没有返回结果的情况下捕获异常时?
var result = List.Where(x => x == "foo").First();
Run Code Online (Sandbox Code Playgroud)你什么时候想用.FirstOrDefault
?如果没有结果,你总是想要默认类型?
var result = List.Where(x => x == "foo").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)就此而言,拿什么?
var result = List.Where(x => x == "foo").Take(1);
Run Code Online (Sandbox Code Playgroud)dri*_*iis 783
First()
当我知道或期望序列至少有一个元素时我会使用.换句话说,当序列为空时出现异常情况.
使用FirstOrDefault()
时,你知道你需要检查是否有一个元素或没有.换句话说,当序列为空时是合法的.您不应该依赖异常处理来进行检查.(这是不好的做法,可能会伤害表现).
最后,之间的差First()
和Take(1)
是First()
返回元素本身,而Take(1)
返回一个包含恰好一个要素元素的序列.
Jer*_*eer 264
.First
没有结果时会抛出异常..FirstOrDefault
不会,它只会返回null(引用类型)或值类型的默认值.(例如,0
对于一个int.)这里的问题不是你想要的默认类型,而是更多:你是否愿意处理异常或处理默认值?由于异常应该是例外,FirstOrDefault
因此当您不确定是否要从查询中获得结果时,首选.当逻辑上数据应该存在时,可以考虑异常处理.
Skip()
并且Take()
通常在结果中设置分页时使用.(如显示前10个结果,下一页显示下10个,等等)
希望这可以帮助.
mar*_*c_s 112
如果没有要返回的行,则first()将抛出异常,而.FirstOrDefault()将返回默认值(.First()
对于所有引用类型).
所以如果你准备好并愿意处理一个可能的例外,那.FirstOrDefault()
很好.如果你更喜欢检查!= null的返回值,那么NULL
你是更好的选择.
但我想这也是个人偏好.使用对您更有意义的东西,更好地适应您的编码风格.
Muk*_*mar 64
第一()
FirstOrDefault()
我们有一个UserInfos表,它有一些记录,如下所示.在下表的基础上,我创建了示例...
如何使用First()
var result = dc.UserInfos.First(x => x.ID == 1);
Run Code Online (Sandbox Code Playgroud)
只有一条记录ID == 1.应该返回此记录
ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com
var result = dc.UserInfos.First(x => x.FName == "Rahul");
Run Code Online (Sandbox Code Playgroud)
有多个记录,其中FName =="Rahul".第一条记录应该是返回.
ID:7名字:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com
var result = dc.UserInfos.First(x => x.ID ==13);
Run Code Online (Sandbox Code Playgroud)
ID == 13没有记录.应该发生错误.
InvalidOperationException:Sequence不包含任何元素
如何使用FirstOrDefault()
var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);
Run Code Online (Sandbox Code Playgroud)
只有一条记录ID == 1.应该返回此记录
ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com
var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");
Run Code Online (Sandbox Code Playgroud)
有多个记录,其中FName =="Rahul".第一条记录应该是返回.
ID:7名字:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com
var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);
Run Code Online (Sandbox Code Playgroud)
ID == 13没有记录.返回值为null
希望它能帮助您了解何时使用First()
或FirstOrDefault()
.
Meh*_*ari 19
首先,Take
是一种完全不同的方法.它返回一个IEnumerable<T>
而不是一个T
,所以这就是了.
介于First
和之间时FirstOrDefault
,您应该First
在确定元素存在时使用,如果不存在,则会出现错误.
顺便说一句,如果您的序列包含default(T)
元素(例如null
),并且您需要区分为空和第一个元素null
,则不能使用FirstOrDefault
.
use*_*770 13
第一:
FirstOrDefault:
来自:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
需要注意的另一个区别是,如果您在生产环境中调试应用程序,则可能无法访问行号,因此识别方法中的哪个特定.First()
语句会引发异常可能很困难.
异常消息也不包括您可能使用过的任何Lambda表达式,这些表达式会使任何问题更难以调试.
这就是为什么我总是使用FirstOrDefault()
即使我知道一个空条目将构成一个特殊的情况.
var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
throw new Exception(string.Format("Can't find customer {0}.", customerId));
}
Run Code Online (Sandbox Code Playgroud)
第一的()
当您知道结果包含超过 1 个预期元素时,您应该只包含序列的第一个元素。
首先或默认()
FirstOrDefault() 与 First() 类似,不同之处在于,如果没有元素与指定条件匹配,则返回泛型集合的基础类型的默认值。如果没有找到元素,它不会抛出 InvalidOperationException。但是元素或序列的集合为空而不是引发异常。
这种类型的函数属于元素运算符。下面定义了一些有用的元素运算符。
当我们需要根据特定条件从序列中选择单个元素时,我们会使用元素运算符。这是一个例子。
List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };
Run Code Online (Sandbox Code Playgroud)
First() 运算符在满足条件后返回序列的第一个元素。如果没有找到元素,那么它将抛出异常。
int result = items.Where(item => item == 2).First();
FirstOrDefault() 运算符在满足条件后返回序列的第一个元素。如果没有找到元素,那么它将返回该类型的默认值。
int result1 = items.Where(item => item == 2).FirstOrDefault();