提问



我已经四处寻找并且没有真正找到一个明确的答案,你何时想要使用.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()之间的区别在于First()返回元素本身,而Take()返回一个只包含一个元素的元素序列。 (如果传递1作为参数)。

其它参考1


.First会在没有结果时抛出异常。 .FirstOrDefault赢了t,它将简单地返回null(引用类型)或值类型的默认值。(例如对于int的0。)这里的问题不是你想要的时候默认类型,但更多:您是否愿意处理异常或处理默认值?由于异常应该是例外,当您不确定是否要从查询中获取结果时,首选FirstOrDefault当逻辑上数据存在时,可以考虑异常处理。


Skip()Take()通常在结果中设置分页时使用。 (如显示前10个结果,下一页显示下10个,等等)


希望这可以帮助。

其它参考2


如果没有要返回的行,则first()将抛出异常,而.FirstOrDefault()将返回默认值(所有引用类型的NULL)。


因此,如果您已经准备好并愿意处理可能的异常,.First()就可以了。如果您更愿意检查!= null的返回值,那么.FirstOrDefault()是您更好的选择。


但我想这也是一种个人偏好。使用对你更有意义的东西,更好地适应你的编码风格。

其它参考3


首先()



  1. 返回序列的第一个元素。

  2. 当结果中没有元素或源为null时抛出错误。

  3. 你应该使用它,如果预期有多个元素而你只想要第一个元素。



FirstOrDefault()



  1. 返回序列的第一个元素,如果未找到任何元素,则返回默认值。

  2. 只有在源为空时才会抛出错误。

  3. 你应该使用它,如果预期有多个元素而你只想要第一个元素。
    如果结果是空的也很好。



我们有一个UserInfos表,它有一些记录,如下所示。在下表的基础上,我创建了示例...





如何使用First()


var result = dc.UserInfos.First(x => x.ID == 1);


ID == 1只有一条记录。应该返回此记录

ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com


var result = dc.UserInfos.First(x => x.FName == "Rahul");   


有多个记录,其中FName ==Rahul。第一条记录应该是返回。

ID:7名字:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com


var result = dc.UserInfos.First(x => x.ID ==13);


ID == 13没有记录。应该发生错误。

InvalidOperationException:Sequence不包含任何元素


如何使用FirstOrDefault()


var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);


ID == 1只有一条记录。应该返回此记录

ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com


var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");


有多个记录,其中FName ==Rahul。第一条记录应该是返回。

ID:7名字:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com


var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);


ID == 13没有记录。返回值为null


希望它能帮助您了解何时使用First()FirstOrDefault()

其它参考4


首先,Take是一种完全不同的方法。它返回IEnumerable<T>而不是单个T,所以s out。


FirstFirstOrDefault之间,当你确定一个元素存在且它不存在时,你应该使用First,那么就有一个错误。


顺便说一下,如果你的序列包含default(T)个元素(例如null)并且你需要区分为空和第一个元素是null,你就不能使用FirstOrDefault]]。

其它参考5


第一:



  • 返回序列的第一个元素

  • 引发异常:结果中没有元素

  • 使用时间:当预期超过1个元素且您只想要第一个



FirstOrDefault:



  • 返回序列的第一个元素,如果没有找到元素,则返回默认值

  • 抛出异常:仅当源为空时

  • 在以下情况下使用:当预期超过1个元素且您只想要第一个元素时。结果也可以是空的



来自:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/[54]

其它参考6


需要注意的另一个区别是,如果您在生产环境中调试应用程序,则可能无法访问行号,因此识别方法中哪个特定.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));
}

其它参考7


我找到了一个网站,呼吁解释对FirstOrDefault的需求
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/结果
如果查询没有结果,并且您想要调用First()或Single()来获取单行...您将获得Sequence contains no elements异常。[55]


免责声明:我从未使用过LINQ,所以如果这是不合适的话我会道歉。

其它参考8


首先()


当您知道结果包含多于1个元素时,您应该只是序列的第一个元素。


FirstOrDefault()


FirstOrDefault()与First()类似,不同之处在于,如果没有元素匹配指定的条件,则返回默认值为泛型集合的基础类型。如果没有找到元素,它不会抛出InvalidOperationException。但是元素或序列的集合是空的,而不是抛出异常。

其它参考9


someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)


哪一个使用?
它应该由业务逻辑决定,而不是对异常/程序失败的恐惧。


例如,
如果业务逻辑说我们在任何工作日都不能进行零交易(假设)。那么你不应该尝试通过一些智能编程来处理这种情况。
我总是会在这样的集合中使用First(),如果其他东西搞砸了业务逻辑,那么让程序失败。


码:


var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()


我想看到其他人对此发表评论。

其它参考10


好吧,让我给我两分钱。
First/Firstordefault适用于使用第二个构造函数的情况。我不会解释它是什么,但是当你可能总是使用一个因为你不想引起异常时。


person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));

其它参考11


这种类型的函数属于元素运算符。下面定义了一些有用的元素运算符。



  1. 首先/FirstOrDefault

  2. 最后/LastOrDefault

  3. 单/的SingleOrDefault



当我们需要根据特定条件从序列中选择单个元素时,我们使用元素运算符。这是一个例子。


  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9,2,10};


First()运算符在满足条件后返回序列的第一个元素。如果没有找到任何元素,那么它将通过例外。


int result=items.Where(item => item == 2).First();


FirstOrDefault()运算符在满足条件后返回序列的第一个元素。如果未找到任何元素,则它将返回该类型的默认值。


int result1=items.Where(item => item == 2).FirstOrDefault();

其它参考12


很抱歉发布旧帖子的答案。细节和良好解释请阅读以下网址http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/[56]


http://www.dotnet-tricks.com/Tutorial/linq/E23I160714-Understanding-Single,-SingleOrDefault,-First-and-FirstOrDefault.html[57]


http://www.c-sharpcorner.com/UploadFile/3d39b4/singleordefault-and-firstordefault-methods-in-linq-to-sql/[58]

其它参考13


linq在集合上实现单个简单查询的方法很多,只需在sql中编写连接,根据需要和必要性,可以先应用或最后应用过滤器。


这是一个示例,我们可以在集合中找到具有id的元素。
要在此上添加更多内容,方法First FirstOrDefault在理想情况下在集合至少有一条记录时返回相同的内容。但是,如果集合可以为空。然后First将返回一个例外,但FirstOrDefault将返回null或默认值。例如,int将返回0.因此,虽然这样做是个人偏好,但最好使用FirstOrDefault来避免异常处理。
[59]