首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FirstOrDefault扩展方法是如何工作的?

FirstOrDefault扩展方法是如何工作的?
EN

Stack Overflow用户
提问于 2010-09-13 19:53:47
回答 3查看 6.5K关注 0票数 3

我想知道FirstOrDefault扩展方法是如何工作的?它遵循以下哪种算法?

使用:

代码语言:javascript
复制
var arr = new[] {1, 2, 3, 4, 5, 6, 7};
return arr.FirstOrDefault(x => x%2 == 0);

算法1:

代码语言:javascript
复制
for(int i = 0; i < arr.Length; i++)
{
   if(arr[i] % 2 == 0)
     return arr[i];
}
return 0;

算法2:

代码语言:javascript
复制
var list = new List<int>();
for(int i = 0; i < arr.Length; i++)
{
   if(arr[i] % 2 == 0)
     list.Add(arr[i]);
}
return list.Count == 0 ? 0 : list[0];

FirstOrDefault算法是否足够智能,可以选择最优的算法,或者它严格遵循这些算法中的任何一个?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-13 20:01:11

我在Reflector上找过了

代码语言:javascript
复制
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    IList<TSource> list = source as IList<TSource>;
    if (list != null)
    {
        if (list.Count > 0)
        {
            return list[0];
        }
    }
    else
    {
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                return enumerator.Current;
            }
        }
    }
    return default(TSource);
}

如果集合可以被强制转换为IList (并实现Count属性),它会尝试使用List来执行此操作。否则,它将使用枚举器。

编辑:带有谓词的另一种方法(我现在看到您正在讨论的方法)没有优化得那么好,它依赖于IEnumerable接口来执行foreach而不是IList。

代码语言:javascript
复制
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    if (predicate == null)
    {
        throw Error.ArgumentNull("predicate");
    }
    foreach (TSource local in source)
    {
        if (predicate(local))
        {
            return local;
        }
    }
    return default(TSource);
}
票数 9
EN

Stack Overflow用户

发布于 2010-09-13 19:57:44

First/FirstOrDefault选择序列中的第一个元素,没有什么聪明的。

  • FirstOrDefault
  • First
票数 1
EN

Stack Overflow用户

发布于 2010-09-13 19:58:29

两者都不是,它使用枚举器只读取第一个值。当没有第一个值时,它返回null (或者更确切地说,返回当前<T>的默认值)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3700131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档