在LINQ中,Find优先于First,反之亦然?

时间:2014-01-22 00:50:42

标签: c# linq

此代码有效:

public SiteMapping GetById(int ID)
{
    var entity = siteMappings.First(p => p.Id == ID);
    return entity == null ? null : entity;
}

......这样做(结果相同):

public SiteMapping GetById(int ID)
{
    var entity = siteMappings.Find(p => p.Id == ID);
    return entity == null ? null : entity;
}

是否有理由更喜欢一个(第一个,或查找)而不是另一个?

更新

所以,使用里德的建议,我所需要的只是:

public SiteMapping GetById(int ID)
{
    return = siteMappings.FirstOrDefault(p => p.Id == ID);
}

...它是安全的/它优雅地失败(当然,当提供适当的ID值时根本不会失败)。

1 个答案:

答案 0 :(得分:9)

如果找不到该对象,

First将引发异常。 FirstOrDefaultFind更相似。请注意,在您的第一个示例中,如果未找到return entity;,则将永远不会发生空检查(应该删除,并且只写为Id,因为三元无用)方法会引发异常。

FirstOrDefaultIEnumerable<T>IQueryable<T>上的扩展方法,这意味着它可以在比Find方法更多的方案中工作,这是一种在特定班级。

如果这是List<T>.Find,则FirstOrDefaultFind都将为O(n)且性能基本相同,因此两者都没有明确的优势。我通常更喜欢FirstOrDefault只是因为它更灵活,并且允许您更改集合类型而无需更改方法。