Friday, December 2, 2011

ElementAt() vs. []

Beispiel: enumeration.ElementAt(i);



In ein paar Arbeiten fiel mir auf, dass ein paar Mitarbeiter die LINQ-Methode ElementAt einsetzten.
Klar war man wollte dort ein Element aus einer Enumeration herausholen. Aber warum nicht mit den eckigen Klammern "[]".

Somit suchte ich mir die Lösung zusammen:
ElementAt kann benutzt werden falls die Enumeration keinen Indexer enthält, somit könnte die Enumeration nicht über den Indexer (eckige Klammer) abgefragt werden. Ausserdem soll die Methode auch nützlich sein falls man nicht weis wie viele Objekte in der Enumeration vorhanden sind.
Was aber ein wichtiger bestandteil diese Methode ist, ist das kontrollieren des Objekttypes. Bei ElementAt wird somit das Element an der gegebenen Position mit dem detektiertem, order vorgegebenen Typ herausgeholt.

Ich kontrollierte darauf ob diese Enumeration einen Index besitzt: Ganz einfach, ich testete es und schaute ob ein Fehler dabei raus kommt was aber nicht der Fall war.
Somit kontrollierte ich mit dem Performance Profiler von RedGate, "ANTS Performance Profiler 6.3", ob ich an dieser Stelle einen Zeitverlust zu verzeichnen habe. Der Test bestätigte meine Vermutung: Zeitverlust.
Diesen kann man somit mit den eckigen Klammern beheben falls die Enumeration einen Index enthält.


Um das ganze zeitlich zu testen, schrieb ich eine kleine Test-Applikation:





Code:


        private void BracketTest()
        {
            int tempVariable;

            //Speed test loop
            for (int i = 0; i < m_Array.Count; i++)
            {
                tempVariable = m_Array[i];
            }
        }

        private void ElementAtTest()
        {
            int tempVariable;

            //Speed test loop
            for (int i = 0; i < m_Array.Count; i++)
            {
                tempVariable = m_Array.ElementAt<int>(i);
            }
        }

Wer den Test selbst durchführen möchte kann dies gerne machen:
SpeedTest.exe*

Hier noch den ganzen Source Code:
SpeedTest.zip*


* Die Links führen auf meinen Öffentlichen Dropbox-Ordner. Die Software ist oder enthält kein Virus oder andere Schadensprogramme.

No comments:

Post a Comment