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

时间:2018-07-15 13:54:44

标签: c# .net list enumeration

LastOrDefault()和Last()方法是否迭代列表中的每个元素以查找最后一个元素?还是他们通过根据元素的索引进行搜索来返回值?

1 个答案:

答案 0 :(得分:3)

如果它是类型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