代码之家  ›  专栏  ›  技术社区  ›  Developer

LastorDefault()和Last()方法是否迭代列表中的每个元素?

  •  1
  • Developer  · 技术社区  · 6 年前

    执行LastorDefault()和Last()方法 迭代 要查找最后一个元素的列表中的每个元素?或者他们是通过基于 指数 元素?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ousmane D.    6 年前

    如果是一种类型 IList 然后不,它不会迭代每一个元素,因为这会非常低效。

    他们就是这样做的:

    public static TSource Last<TSource>(this IEnumerable<TSource> source) {
            if (source == null) throw Error.ArgumentNull("source");
            IList<TSource> list = source as IList<TSource>;
            if (list != null) {
                int count = list.Count;
                if (count > 0) return list[count - 1];
            }
            else {
                using (IEnumerator<TSource> e = source.GetEnumerator()) {
                    if (e.MoveNext()) {
                        TSource result;
                        do {
                            result = e.Current;
                        } while (e.MoveNext());
                        return result;
                    }
                }
            }
            throw Error.NoElements();
        }
    

    LastOrDefault :

    public static TSource LastOrDefault<TSource>(this IEnumerable<TSource> source) {
                if (source == null) throw Error.ArgumentNull("source");
                IList<TSource> list = source as IList<TSource>;
                if (list != null) {
                    int count = list.Count;
                    if (count > 0) return list[count - 1];
                }
                else {
                    using (IEnumerator<TSource> e = source.GetEnumerator()) {
                        if (e.MoveNext()) {
                            TSource result;
                            do {
                                result = e.Current;
                            } while (e.MoveNext());
                            return result;
                        }
                    }
                }
                return default(TSource);
    }
    

    注意,由于每个方法都有几个重载,所以我只显示了上面每个方法中的一个,但是如果您对其他方法感兴趣,那么 feel free to have a look at the source code :