.Last()
扩展方法是否考虑在 IList
上调用?我只是想知道它们之间是否存在显着的性能差异:
IList<int> numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int lastNumber1 = numbers.Last();
int lastNumber2 = numbers[numbers.Count-1];
直觉告诉我,第一个备选方案是 O(n),而第二个是 O(1)。 .Last()
是否“聪明”到足以尝试将其转换为 IList
?
可能不会,因为它可以做到 list[list.count-1]
通过反射器验证:
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];
}
}
...
}