我到处搜索,并没有真正找到一个明确的答案,什么时候你想使用. first,什么时候你想使用. firstordefault与LINQ。

什么时候你想用。first ?只有当你想捕捉异常,如果没有结果返回哪里? var result =列表。Where(x => x == "foo").First(); 什么时候使用。firstordefault ?当你总是想默认类型,如果没有结果? var result =列表。Where(x => x == "foo").FirstOrDefault(); 说到这,那塔克呢? var result =列表。Where(x => x == "foo").Take(1);


当前回答

Linq有很多方法来实现对集合的简单查询,只要我们在sql中写入连接,过滤器可以根据需要或必要性先应用或最后应用。

下面是一个示例,我们可以在集合中找到带有id的元素。 为了进一步说明这一点,当一个集合至少有一条记录时,方法First和FirstOrDefault理想情况下会返回same。但是,如果集合可以为空的话。那么First将返回一个异常,而FirstOrDefault将返回null或默认值。例如,int将返回0。因此,虽然说使用such是个人偏好,但最好使用FirstOrDefault来避免异常处理。

其他回答

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

因此,如果你准备好并愿意处理一个可能的异常,. first()是很好的。如果您更喜欢检查!= null的返回值,那么. firstordefault()是更好的选择。

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

第()

当您知道结果包含超过1个期望的元素时,您应该只输入序列的第一个元素。

FirstOrDefault ()

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

好吧,让我说说我的意见。 First / Firstordefault用于使用第二个构造函数。我不会解释它是什么,但它是指你可能总是使用一个,因为你不想引起异常。

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

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

第一/ FirstOrDefault 去年/ LastOrDefault 单/ 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();

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