关于C#:何时使用.first以及何时使用.firstordefault与linq?

When to use .First and when to use .FirstOrDefault with LINQ?

我到处找了找,还没有找到一个明确的答案,你什么时候想用.First,什么时候想用.FirstOrDefault和linq。

  • 您希望何时使用.First?只有当您想捕获异常时,如果没有结果返回到哪里?

    1
    var result = List.Where(x => x =="foo").First();
  • 你想什么时候使用.FirstOrDefault?如果没有结果,您什么时候总是想要默认类型?

    1
    var result = List.Where(x => x =="foo").FirstOrDefault();
  • 就这一点而言,采取什么?

    1
    var result = List.Where(x => x =="foo").Take(1);


当我知道或期望序列至少有一个元素时,我会使用First()。换句话说,当序列为空是一个例外情况时。

当您知道需要检查元素是否存在时,使用FirstOrDefault()。换句话说,当序列为空是合法的时候。支票不应依赖异常处理。(这是不好的做法,可能会影响性能)。

最后,First()Take(1)之间的区别是,First()返回元素本身,而Take(1)返回一个仅包含一个元素的元素序列。


当没有结果时,.First将抛出异常。.FirstOrDefault不会,它只返回空值(引用类型)或值类型的默认值。(如0表示int.)这里的问题不是您何时需要默认类型,而是更多:您愿意处理异常还是处理默认值?由于异常应该是例外的,所以当您不确定是否要从查询中获得结果时,最好使用FirstOrDefault。当数据在逻辑上应该存在时,可以考虑异常处理。

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

希望这有帮助。


.First()将在没有要返回的行时引发异常,而.FirstOrDefault()将返回默认值(所有引用类型的NULL)。

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

但我想这也是个人喜好。使用对您更有意义的,并且更适合您的编码风格的。


第一()

  • 返回序列的第一个元素。
  • 如果结果中没有元素或源为空,则会引发错误。
  • 如果需要多个元素并且只需要第一个元素,那么应该使用它。
  • 第一个或默认值()

  • 返回序列的第一个元素,如果找不到元素,则返回默认值。
  • 只有当源为空时才会引发错误。
  • 如果需要多个元素并且只需要第一个元素,那么应该使用它。如果结果为空,也很好。
  • 我们有一个userinfos表,其中有一些记录,如下所示。根据下表,我创建了一个示例…

    UserInfo Table

    如何使用first())

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

    只有一条记录的id==1。应返回此记录ID:1名字:Manish姓氏:Dubey电子邮件:[email protected]

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

    有多个记录,其中fname="rahul"。第一条记录应返回。ID:7名字:Rahul姓氏:Sharma电子邮件:[email protected]

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

    没有ID==13的记录。应该发生错误。InvalidOperationException:序列不包含元素

    如何使用FirstOrDefault()。

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

    只有一条记录的id==1。应返回此记录ID:1名字:Manish姓氏:Dubey电子邮件:[email protected]

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

    有多个记录,其中fname="rahul"。第一条记录应返回。ID:7名字:Rahul姓氏:Sharma电子邮件:[email protected]

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

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

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


    首先,Take是一种完全不同的方法。它返回一个IEnumerable,而不是一个T,所以就不存在了。

    FirstFirstOrDefault之间,当确定某个元素存在时,应该使用First,如果不存在,则会出现错误。

    顺便说一下,如果您的序列包含default(T)个元素(例如NULL,您需要区分为空元素和第一个元素是NULL,则不能使用FirstOrDefault


    第一:

    • 返回序列的第一个元素
    • 引发异常:结果中没有元素
    • 当需要一个以上的元素并且只需要第一个元素时使用

    FirstOrDefault:

    • 返回序列的第一个元素,如果找不到元素,则返回默认值
    • 引发异常:仅当源为空时
    • 当需要一个以上的元素并且只需要第一个元素时使用。结果为空也可以

    发件人:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-first-ordefault/


    另一个需要注意的区别是,如果您在生产环境中调试应用程序,则可能无法访问行号,因此在方法中标识哪个特定的.First()语句引发了异常可能很困难。

    异常消息也将不包括您可能使用过的任何lambda表达式,这将使任何问题更难调试。

    这就是为什么我总是使用FirstOrDefault()的原因,即使我知道一个空条目将构成一种特殊情况。

    1
    2
    3
    4
    5
    var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
    if (customer == null)
    {
       throw new Exception(string.Format("Can't find customer {0}.", customerId));
    }

    第一()

    当您知道结果包含预期的超过1个元素并且您应该只包含序列的第一个元素时。

    第一个或默认值()

    FirstOrDefault()与First()一样,只是如果没有元素匹配指定的条件,那么它将返回泛型集合的基础类型的默认值。如果找不到元素,则不会引发InvalidOperationException。但元素或序列的集合为空,而不是引发异常。


    我找到了一个网站来解释第一个或第二个违约的必要性。http://thepursuitofalive.com/the-linq-first或efault-method-and-null-resultsets/如果查询没有结果,并且要调用First()或Single()以获取单行…您将得到一个"sequence contains no elements"异常。

    免责声明:我从来没有用过Linq,所以如果这有点离谱,我很抱歉。


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

  • 第一个/第一个或默认值
  • 上一个/上一个或默认值
  • 单个/单个或默认
  • 当需要根据特定条件从序列中选择单个元素时,我们使用元素运算符。下面是一个例子。

    1
      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();


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

    用哪一个?它应该由业务逻辑决定,而不是害怕异常/程序失败。

    例如,如果业务逻辑表明我们在任何工作日都不能进行零事务处理(只是假设)。那么您不应该尝试用一些智能编程来处理这个场景。我将始终在此类集合上使用first(),并在其他东西破坏业务逻辑时让程序失败。

    代码:

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

    我想看看其他人对此的评论。


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

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


    连接许多实现收集单一查询的方法,just we write joins in SQL,a filter can be applied first or last depending on need and necessity.

    这是一个例子,说明我们可以在一个收藏中找到一个有标识的元素。在这方面,方法一,FirstOrDefault,理想的情况是,当一个收藏有一个最起码的记录。如果,不过,一个收藏品可以被收藏。然后,威尔回归一个例外,但FirstOrDefaultwill return nullor default.For instance,intWill return 0.这种用途虽然说是个人偏爱,但更好地使用FirstOrDefault避免例外处理。MGX1〔0〕