2010-06-07 10 views
5

Der Code, den ich schreibe, erhält eine ArrayList aus nicht verwaltetem Code, und diese ArrayList enthält immer ein oder mehrere Objekte vom Typ Grid_Heading_Blk. Ich habe darüber nachgedacht, diese ArrayList in eine generische Liste zu ändern, bin mir jedoch nicht sicher, ob die Konvertierung so teuer ist, dass die Vorteile der Arbeit mit der generischen Liste zunichte gemacht werden. Momentan verwende ich nur eine Operation foreach (Grid_Heading_Blk in myArrayList), um mit dem ArrayList-Inhalt zu arbeiten, nachdem ich die ArrayList an die Klasse übergeben habe, die sie verwenden wird.Konvertiert diese ArrayList in eine generische Liste effizient?

Sollte ich die ArrayList in eine generische typisierte Liste konvertieren? Und wenn ja, was ist der effizienteste Weg?

Antwort

2

Hier ist ein Stich auf eine performante Weise, um eine generische Liste von einer ArrayList zu erstellen.

List<Grid_Heading_Blk> myList = new List<Grid_Heading_Blk>(source.Count); 
myList.AddRange(source.OfType<Grid_Heading_Blk>()); 

Durch den Konstruktor aufrufen, die einen int annimmt, wird die Sicherungsspeicher nur einmal vergeben.

Wie immer sollten Sie die Leistung mit den Werkzeugen messen, die Sie normalerweise verwenden.

+1

Danke, jeder mit. Viele gute Antworten hier. Während Leistung/Effizienz sicherlich ein Schlüsselthema ist, habe ich vielleicht die Lesbarkeit einer typisierten Struktur unterschätzt. Wenn jemand anderen meinen Code schließlich behält, möchte ich, dass es so klar wie möglich ist, was ich tue. – Greg

1

Die größte Strafe, die Sie mit ArrayLists haben, ist Boxen.

Mit Generika erhalten Sie:
1. Kompilierung Sicherheit
2. Generika Erweiterungen
3. Entfernen diese Einschränkung alles in der Liste convert des Habens Objekt einzugeben.

Das sind die Vorteile, die Sie mit ihnen haben. Sie sind von Vorteil, aber wenn Sie das generische Objekt aus der ArrayList neu auffüllen müssen, ist es möglicherweise nicht sinnvoll, das zu tun, besonders wenn Sie nur die Liste durchlaufen, um die Objekte zu erhalten.

0

"Effizient" ist keine Entweder-Oder-Eigenschaft. Es ist relativ, genauso wie eine große Maus wahrscheinlich nicht größer ist als ein kleiner Elefant.

Es hängt davon ab, was Sie sonst noch tun.

Leistung kann variieren, aber nach meiner Erfahrung, während ArrayList kann „langsamer“ als List<T>, habe ich noch nie so wenig anderes getan, dass sie in irgendeiner Weise bemerkbar war.

Das heißt, es ist schön, den Compiler Typ-Überprüfung für mich zu tun, und es ist schön, nicht Dinge zu werfen.

2

benutze ich oft diese Checkliste Fragen wie die Ihre bewerten:

  1. Machen Sie es sich richtig
  2. Machen Sie deutlich,
  3. Machen Sie es prägnant
  4. Machen Sie es effizient

List<Grid_Heading_Blk> ist weit mehr Intention-Enthüllung als ArrayList. Also, ohne auch nur die Effizienz unter Berücksichtigung, gibt es bereits ein großer Gewinn für Punkt 2.

Um eine ArrayList zu einem List<> zu konvertieren, müssen Sie einmal die ArrayList laufen und jedes Element gegossen. Die foreach macht eine implizite Umwandlung, so dass der Overhead nur in der zusätzlichen Iteration ist.

Das wiederholte Iterieren einer Sequenz dauert von O(n) bis O(2n), was immer noch O(n) ist (Größe, nicht Wert, ist was für die Leistung wichtig). Daher können Sie die Änderung als gutartig betrachten.

Wenn jedoch buchstäblich alle Sie tun, ist die foreach läuft, sollten Sie nur ArrayList direkt verwenden - es List<> Ändern kauft man nicht mehr Ausdruckskraft.

0

Wenn die Objekte aus nicht verwaltetem Code stammen und Sie keine Objekte hinzufügen oder entfernen müssen, ist ein Array von Grid_Heading_Blk möglicherweise effizienter als eine Liste. Wenn Sie ein Array verwenden können, ist die Verwendung einer for-Schleife möglicherweise etwas schneller als foreach.

2

Warum müssen Sie die ArrayList überhaupt konvertieren? Um ehrlich zu sein, scheint Ihre foreach-Schleife, als würde es den Trick tun. Ja, wie Kevin sagt, ist die einzige Strafe, die Sie zahlen würden, Unboxing - aber wie es aussieht, ist es ein ziemlich einfacher Code und Sie haben wahrscheinlich nicht genug Raster-Überschriften, um einen echten Performance-Hit zu bezahlen.

Aber wenn Sie es konvertieren muss ich sagen würde, anstatt Ihre eigene for-Schleife Schreiben in die Liste generischen Typ zu konvertieren, könnte es besser sein, den Konstruktor zu verwenden, die IEnumerable Typ nimmt (etwas ArrayList bereits umsetzen sollten.)

List<Grid_Heading_Blk> heading = new List<Grid_Heading_Blk>(arrayList); 
Verwandte Themen