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

C# LastOrDefault()和Last()方法是否迭代列表中的每个元素?,c#,.net,list,enumeration,C#,.net,List,Enumeration,LastOrDefault()和Last()方法是否迭代列表中的每个元素以查找最后一个元素?或者,他们是通过基于元素的索引进行搜索来返回值吗?如果它是类型IList,则不会迭代每个元素,因为这将非常低效 他们就是这样做的: public static TSource Last<TSource>(this IEnumerable<TSource> source) { if (source == null) throw Error.ArgumentNull("

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

如果它是类型
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();
    }

注意,由于每个方法都有几个重载,我只在上面展示了其中的一个,但是如果您对其他方法感兴趣,那么:

如果它是一个类型
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();
    }

注意,由于每个方法都有两个重载,我只在上面展示了其中一个,但是如果您对其他方法感兴趣,那么:

可能会,但只有在集合没有实现IList的情况下。不幸的是,您需要对照每个操作符的源来检查这些。LINQ获得了大部分的
IList
/
ICollection
优化,但它遗漏了一些重要的优化,例如。它可能会,但只有在集合未实现IList的情况下。不幸的是,您需要对照每个操作符的源来检查这些。LINQ获得了大部分的IList/
ICollection
优化,但它忽略了一些重要的优化,例如。