LastOrDefault() 和 Last() 方法是否迭代列表的每个元素?
Do LastOrDefault() and Last() methods iterate each and every element of the list?
执行 LastOrDefault() 和 Last() 方法 迭代 列表的每个元素以找到最后一个元素?或者他们是否通过基于元素的 index 搜索返回值?
如果它是 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:
执行 LastOrDefault() 和 Last() 方法 迭代 列表的每个元素以找到最后一个元素?或者他们是否通过基于元素的 index 搜索返回值?
如果它是 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: