Contiene un'ottimizzazione per tutto ciò che implementa IList<T>
nel qual caso cerca solo l'articolo alla lunghezza -1.
Tenete a mente che la stragrande maggioranza delle cose che manderà nel implementerà IList<T>
List<int>
int[]
e così via ... tutto implementare IList<T>
Per coloro che non possono guardare il codice di conferma, è possibile confermare utilizzando osservazione:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace ConsoleApplication4 {
class Program {
static void Profile(string description, int iterations, Action func) {
// clean up
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// warm up
func();
var watch = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
static void Main(string[] args) {
int[] nums = Enumerable.Range(1, 1000000).ToArray();
int a;
Profile("Raw performance", 100000,() => { a = nums[nums.Length - 1]; });
Profile("With Last", 100000,() => { a = nums.Last(); });
Console.ReadKey();
}
}
}
uscita:
0.123.
Raw performance Time Elapsed 1 ms
With Last Time Elapsed 31 ms
Quindi è solo 30 volte più lento e mantiene quel profilo di prestazioni con qualsiasi lista di lunghezza, che non è nulla nel grande schema di cose.
fonte
2009-09-04 08:16:00
Quale albero di ereditarietà per gli iteratori? C++ non ha i metodi di estensione in primo luogo, quindi 'end()' su 'vector' è semplicemente implementato in modo diverso da quello di' list', e tutto ciò che vuole lavorare con gli iteratori per uno deve essere un 'template 'su' Iterator' parametro di tipo. –