C# LastOrDefault()和Last()方法是否迭代列表中的每个元素?
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("
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
优化,但它忽略了一些重要的优化,例如。