代码之家  ›  专栏  ›  技术社区  ›  Metro Smurf

何时使用.First以及何时使用.FirstOrDefault与LINQ?

  •  739
  • Metro Smurf  · 技术社区  · 17 年前

    我已经四处搜索了一下,还没有找到一个明确的答案,你什么时候想使用它 .First 当你想使用 .FirstOrDefault

    • 您想什么时候使用 第一

      var result = List.Where(x => x == "foo").First();
      
    • 你想什么时候使用 .第一道防线 ? 如果没有结果,您总是希望使用默认类型?

      var result = List.Where(x => x == "foo").FirstOrDefault();
      
    • 就这件事来说,你要拿什么?

      var result = List.Where(x => x == "foo").Take(1);
      
    13 回复  |  直到 14 年前
        1
  •  853
  •   jpaugh JotaBe    7 年前

    First() 当我知道或期望序列至少有一个元素时。换句话说,在异常情况下,序列为空。

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

    最后,两者之间的区别 第一() Take(1) 是吗 第一() 采取(1)

        2
  •  285
  •   dif    9 年前

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

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

    希望这有帮助。

        3
  •  126
  •   A. Gladkiy    7 年前

    .First() .FirstOrDefault() NULL 对于所有引用类型)而不是。

    所以如果你准备好并愿意处理一个可能的异常, .First() 很好。如果您希望检查 != null 无论如何,那么 .FirstOrDefault()

    但我想这也有点个人偏好。使用对您更有意义且更适合您的编码风格的代码。

        4
  •  73
  •   p__d    10 年前

    第一()

    1. 返回序列的第一个元素。
    2. 如果需要多个元素,并且只需要第一个元素,则应该使用它。

    FirstOrDefault()

    1. 返回序列的第一个元素,如果找不到元素,则返回默认值。
    2. 仅当源为空时,它才会抛出错误。
    3. 如果需要多个元素,并且只需要第一个元素,则应该使用它。

    我们有一个UserInfos表,其中有一些记录,如下所示。根据下表,我创建了示例。。。

    UserInfo Table

    如何使用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”。第一条记录应该是return。

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

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

    如何使用FirstOrDefault()

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

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

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

    有多条记录,其中FName==“Rahul”。第一条记录应该是return。

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

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

        5
  •  21
  •   Mehrdad Afshari    17 年前

    首先 Take 这是一种完全不同的方法。它返回一个 IEnumerable<T> T ,那就完了。

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

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

        6
  •  15
  •   user2051770    13 年前

    • 返回序列的第一个元素

    第一默认值:

    • 返回序列的第一个元素,如果找不到元素,则返回默认值
    • 使用时间:当需要多个元素且仅需要第一个元素时。结果为空也可以

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

        7
  •  13
  •   Kye    11 年前

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

    第一()

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

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

        9
  •  6
  •   Ramazan Binarbasi    7 年前

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

    1. 单个/单个或默认值

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

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

    运算符返回满足条件后序列的第一个元素。如果没有找到元素,那么它将抛出异常。

    运算符返回满足条件后序列的第一个元素。如果没有找到元素,那么它将返回该类型的默认值。

        10
  •  3
  •   NULL    17 年前

    我找到了一个网站,上面解释了FirstOrDefault的必要性
    http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
    如果查询没有结果,并且您希望调用First()或Single()来获取单行。。。您将获得一个序列,该序列不包含任何元素异常。

        11
  •  2
  •   Manish Basantani    17 年前
    someList.First(); // exception if collection is empty.
    someList.FirstOrDefault(); // first item or default(Type)
    

    用哪一个?

    例如, 如果业务逻辑说在任何工作日都不能有零事务(只需假设)。那么,您不应该尝试使用一些智能编程来处理这种情况。 我将始终在这样的集合上使用First(),如果有其他东西破坏了业务逻辑,就让程序失败。

    代码:

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

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

        12
  •  2
  •   Vasil Kosturski    6 年前

    First() FirstOrDefault() . 我想进一步解释这些方法的语义。在我看来 FirstOrDefault FirstOrDefault() 代码的味道不是因为它有问题,而是因为它被频繁使用。 This blog post 详细探讨这个话题。大多数时候 SingleOrDefault() 是一个更好的选择,所以要小心这个错误,确保你使用最合适的方法,清楚地表达你的合同和期望。

        13
  •  1
  •   BoltClock    14 年前

    First/Firstordefault用于使用第二个构造函数。我不会解释它是什么,但它是指您可能会一直使用它,因为您不想引起异常。

    person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
    {
        return string.IsNullOrEmpty(p.Relationship);
    }));
    
        14
  •  -6
  •   Paolo Forgia panoet    9 年前

    linq有很多方法可以在集合上实现单个简单查询,只要我们在sql中编写联接,就可以根据需要首先或最后应用过滤器。

    要添加更多信息,请先添加方法, FirstOrDefault ,当集合至少有一条记录时,理想情况下会返回相同的值。但是,如果集合可以为空。然后 First 将返回异常,但 会回来的 null 或者违约。例如, int 第一默认值 here is an example where, we run over a collection of transactionlist

    推荐文章