代码之家  ›  专栏  ›  技术社区  ›  Anindya Chatterjee

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

  •  3
  • Anindya Chatterjee  · 技术社区  · 14 年前

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

    用途:

    var arr = new[] {1, 2, 3, 4, 5, 6, 7};
    return arr.FirstOrDefault(x => x%2 == 0);
    

    算法1:

    for(int i = 0; i < arr.Length; i++)
    {
       if(arr[i] % 2 == 0)
         return arr[i];
    }
    return 0;
    

    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算法是否聪明到可以选择最优算法,还是严格遵循这些算法中的任何一种?

    3 回复  |  直到 14 年前
        1
  •  9
  •   Rob Stevenson-Leggett    14 年前

    我往里面看了看 Reflector :

    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属性),它将尝试使用列表来执行此操作。否则它将使用枚举器。

    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);
    }
    
        2
  •  1
  •   Bronumski    14 年前
        3
  •  1
  •   Hans Kesting    14 年前

    <T> ).