【问题标题】:Is Find preferred over First, or vice versa, in LINQ? [duplicate]在 LINQ 中 Find 是否优先于 First,反之亦然? [复制]
【发布时间】:2014-01-22 00:50:42
【问题描述】:

此代码有效:

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;
}

是否有理由偏爱其中一个(First 或 Find)而不是另一个?

更新

所以,按照 Reed 的建议,我只需要这样:

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

...而且它是安全的 / 它会优雅地失败(当然,当提供正确的 ID val 时,它根本不会失败)。

【问题讨论】:

  • entity == null ? null : entityentity 相同
  • 这是 LINQ to Sql 还是只是 Linq to objects
  • 有关Find()First()..stackoverflow.com/questions/4369040/… 的更多信息,请参阅此线程,尽管这听起来像是基于意见的问题..
  • @elgonzo 如果实体为空,您的结果将始终为空。这就是@SLaks 的意义所在。因此,该调用是多余的。 '目的 ?? null' 只会执行 '??' 之后的代码如果对象为空。因此如果objectnull 则返回null?
  • @Nico Id 说这是那个问题的重复。

标签: c# linq


【解决方案1】:

First 如果找不到对象,将引发异常。 FirstOrDefault 会更类似于 Find。请注意,在您的第一个示例中,如果未找到 Id,则将永远不会发生空检查(应该消除,并且只写为 return entity;,因为三元组没有用),因为该方法将引发例外。

FirstOrDefaultIEnumerable<T>IQueryable<T> 上的扩展方法,这意味着它比Find 方法适用于更多场景,Find 方法是在特定类上定义的方法。

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

【讨论】:

  • 酷 - 使用 FirstOrDefault(),我不再需要捷克语为 null - 如果我传递一个不存在的 ID,它会优雅地失败。
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多