2012-06-21 3 views
10

In Anbetracht der Grenzen eines List bekannt sind, zählt .Last() die Sammlung?Führt die Liste <T> .Last() die Auflistung auf?

Ich frage dies, weil die documentation sagt, dass es durch Enumerable (in diesem Fall ist es würde Notwendigkeit, die Sammlung aufzuzählen) definiert ist

Wenn es nicht die Sammlung aufzählen dann greife ich einfach die letzte Element von Index (wie wir wissen, die .Count ein List<T>), aber es scheint dumm, dies zu tun zu haben ....

+0

Wenn Sie wissen, Sie haben eine 'Liste ', dann greifen nur das letzte Element die schnelle Art und Weise, ohne auf mögliche nicht-dokumentierte Optimierungen unter Berufung in 'Last()'. (Es passiert so, dass 'Last()' * * überprüft, ob der Empfänger 'IList ' implementiert und diesen Fall optimiert.) – dlev

+0

@dlev ja, wie ich bereits erwähnte, weiß ich, dass ich das tun kann ... I Ich frage besonders nach der Implementierung von '.Last' – Matthew

+0

Ich bin mir ziemlich sicher, dass die Implementierung nach' List 'sucht und wenn möglich auf das letzte Element per Index zugreift. – Lee

Antwort

11

es die Sammlung nicht aufzählen, wenn sie ein IEnumerable<T> und keine IList<T> (mit einem Array oder eine Liste ist die Index würde verwendet werden).

Enumerable.Last wird auf die folgende Art und Weise (ILSpy) umgesetzt:

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> enumerator = source.GetEnumerator()) 
     { 
      if (enumerator.MoveNext()) 
      { 
       TSource current; 
       do 
       { 
        current = enumerator.Current; 
       } 
       while (enumerator.MoveNext()); 
       return current; 
      } 
     } 
    } 
    throw Error.NoElements(); 
} 
+0

Ihr Code hat gezeigt, dass ** nein **, es verursacht keine Aufzählung der 'Liste ' ... aber deine erste Zeile sagt "Ja" ;-) – Matthew

+0

Meinst du nicht "nein"? Es sieht so aus, als ob es nach IList für mich sucht ... – itsme86

+2

@MatthewPK Es ist "Ja, es wird die gesamte Aufzählung durchlaufen, wenn es kein' IList '" Ein wenig verwirrend, aber korrekt ist. – dlev

Verwandte Themen