首页 文章

何时使用.First和何时使用.FirstOrDefault和LINQ?

提问于
浏览
712

我真的找到了一个明确的答案,你何时想要使用 .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);

14 回答

  • 1

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

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

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

  • 244

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

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

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

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

  • 6

    First()

    • 返回序列的第一个元素 .

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

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

    FirstOrDefault()

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

    • 仅在源为null时抛出错误 .

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

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

    UserInfo Table

    How to use 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不包含任何元素

    How to Use 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() .

  • 13

    第一:

    • 返回序列的第一个元素

    • 抛出异常:结果中没有元素

    • 在以下情况下使用:当预期超过1个元素且您只想要第一个元素时

    FirstOrDefault:

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

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

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

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

  • 0

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

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

    • First / FirstOrDefault

    • Last / LastOrDefault

    • Single / SingleOrDefault

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

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

    First() operator returns the first element of a sequence after satisfied the condition. If no element is found then it will throw an exception.

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

    FirstOrDefault() operator returns the first element of a sequence after satisfied the condition. If no element is found then it will return default value of that type.

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

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

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

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

    码:

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

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

  • 94

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

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

  • 59

    .First 将在没有结果时抛出异常 . .FirstOrDefault 不会,它只返回null(引用类型)或值类型的默认值 . (例如对于int来说就像 0 . )这里的问题不是你想要的默认类型,而是更多:你是否愿意处理异常或处理默认值?由于异常应该是例外情况,因此当您从查询中获取结果时,首选 FirstOrDefault . 当逻辑上数据应该存在时,可以考虑异常处理 .

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

    希望这可以帮助 .

  • 714

    当我知道或期望序列至少有一个元素时,我会使用 First() . 换句话说,当序列为空时出现异常情况 .

    当您知道需要检查是否存在元素时,请使用 FirstOrDefault() . 换句话说,当序列为空时是合法的 . 您不应该依赖异常处理来进行检查 . (这是不好的做法,可能会伤害表现) .

    最后, First()Take() 之间的区别在于 First() 返回元素本身,而 Take() 返回包含恰好一个元素的元素序列 . (如果传递1作为参数) .

  • -3

    First()

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

    FirstOrDefault()

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

  • 3

    首先, Take 是一种完全不同的方法 . 它返回一个 IEnumerable<T> 而不是一个 T ,所以就这样了 .

    FirstFirstOrDefault 之间,你应该在're sure that an element exists and if it doesn'时使用 First ,然后出现错误 .

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

相关问题