ArrayList gegen ein Array von Objekten versus Sammlung von T

7

Ich habe eine Klasse Customer (mit typischen Kundeneigenschaften) und ich muss ein "Stück" von Customer Instanzen weitergeben und Datenbind. Zur Zeit verwende ich ein Array von Customer , aber ich habe auch Collection von T (und List von T verwendet, bevor ich von Collection von T wusste). Ich möchte den dünnsten Weg, um dieses Stück mit C # und .NET 3.5 zu übergeben.

Momentan funktioniert das Array von Customer gut für mich. Die Daten binden gut und scheinen so leicht wie möglich zu sein. Ich brauche nicht das Zeug List von T bietet und Collection von T scheint immer noch wie Overkill. Das Array erfordert, dass ich im Voraus weiß, wie viele Customer s ich zum Chunk hinzufüge, aber ich weiß das immer im Voraus (zum Beispiel Zeilen auf einer Seite).

Fehle ich etwas Fundamentales oder ist das Array von Customer OK? Gibt es einen Kompromiss, den ich vermisse?

Außerdem gehe ich davon aus, dass Collection von T die alte lose typisierte ArrayList veraltet macht. Bin ich gleich da?

    
rp. 21.02.2009, 20:03
quelle

6 Antworten

4

Niemand hat den Rat der Rahmenrichtlinien erwähnt: Verwenden Sie nicht List<T> in öffentliche APIs :

  

Wir empfehlen die Verwendung von List in nicht   öffentliche APIs aus zwei Gründen.

     
  • List<T> wurde nicht entwickelt, um erweitert zu werden. d. h. Sie können keine überschreiben   Mitglieder. Dies bedeutet zum Beispiel, dass   Ein Objekt, das List<T> von a zurückgibt   Die Eigenschaft kann nicht benachrichtigt werden   wenn die Sammlung geändert wird.   Mit Collection<T> können Sie überschreiben   SetItem geschütztes Mitglied zum Abrufen   "Benachrichtigt", wenn neue Artikel hinzugefügt werden   oder ein vorhandener Artikel wird geändert.

  •   
  • Die Liste enthält viele Elemente, die in vielen Szenarien nicht relevant sind. Wir   sagen Sie, dass List<T> zu "beschäftigt" ist für   öffentliche Objektmodelle. Vorstellen   ListView.Items-Eigenschaft, die zurückgibt    List<T> mit all seinem Reichtum. Jetzt,   schau dir die tatsächliche ListView.Items an   Rückgabetyp; es ist viel einfacher und   ähnlich wie Collection<T> oder    ReadOnlyCollection<T>

  •   

Wenn Ihr Ziel auch eine zweiseitige Datenbindung ist, sehen Sie sich BindingList<T> (mit der Einschränkung, dass es nicht "out of the box" sortierbar ist!)

    
Mitch Wheat 21.02.2009, 23:59
quelle
11

Ja, Collection<T> (oder List<T> häufiger) macht ArrayList ziemlich überflüssig. Insbesondere glaube ich, dass ArrayList in Silverlight 2 nicht unterstützt wird.

Arrays sind in einigen Fällen in Ordnung, sollten aber berücksichtigt werden etwas schädlich - sie haben verschiedene Nachteile. (Sie stehen im Mittelpunkt der Implementierung der meisten Sammlungen, natürlich ...) Ich würde mehr ins Detail gehen, aber Eric Lippert macht es so viel besser als je zuvor in dem Artikel durch den Link referenziert. Ich würde es hier zusammenfassen, aber das ist ziemlich schwer zu machen. Es lohnt sich wirklich, die ganze Post zu lesen.

    
Jon Skeet 21.02.2009 20:06
quelle
3

Im Allgemeinen sollten Sie IEnumerable & lt; T & gt; oder ICollection & lt; T & gt; (Abhängig davon, ob es für Ihren Kunden sinnvoll ist, Artikel hinzuzufügen).

    
Alun Harford 21.02.2009 20:27
quelle
1

Wenn Sie eine unveränderliche Liste von Kunden haben, ist das ... Ihre Kundenliste wird sich nicht ändern, sie ist relativ klein und Sie werden sie immer zuerst durchlaufen und Sie müssen sie nicht zur Liste hinzufügen oder entfernen Sie es, dann ist ein Array wahrscheinlich in Ordnung.

Wenn Sie jedoch unsicher sind, dann ist Ihre beste Wette eine Sammlung von irgendeinem Typ. Welche Sammlung Sie auswählen, hängt von den Vorgängen ab, die Sie ausführen möchten. In den Sammlungen geht es um Einfügungen, Manipulationen, Suchen und Löschen. Wenn Sie häufig nach einem bestimmten Element suchen, kann ein Wörterbuch am besten sein. Wenn Sie die Daten sortieren müssen, funktioniert vielleicht eine SortedList besser.

Ich würde mir keine Sorgen um "leichtgewichtig" machen, es sei denn, Sie sprechen eine riesige Anzahl von Elementen, und selbst dann überwiegen die Vorteile von O (1) -Lookups die Kosten von Ressourcen.

Wenn Sie eine Sammlung "weitergeben", übergeben Sie nur eine Referenz, die im Grunde genommen ein Zeiger ist. Es gibt also keinen Leistungsunterschied zwischen dem Übergeben einer Sammlung und eines Arrays.

    
Erik Funkenbusch 21.02.2009 22:37
quelle
0

Ich stimme Alun zu, mit einem Zusatz. Wenn Sie den Rückgabewert durch den Index myArray [n] adressieren möchten, verwenden Sie eine IList.

Ein Array unterstützt IList (wie auch IEnumerable und ICollection). Wenn Sie also an der Schnittstelle vorbeikommen, können Sie das Array immer noch als zugrunde liegende Datenstruktur verwenden. Auf diese Weise müssen die Methoden, an die Sie das Array übergeben, nicht wissen, dass die zugrunde liegende Datenstruktur ein Array ist:

%Vor%     
JMarsch 21.02.2009 22:33
quelle
0

Ich werde sowohl Jon als auch Eric Lippert ein abweichendes Argument unterbreiten, was bedeutet, dass Sie meiner Antwort in der Tat sehr müde sein sollten!).

Das Herz von Eric Lipperts Argumenten gegen Arrays besteht darin, dass die Inhalte unveränderlich sind, während die Datenstruktur selbst dies nicht ist. In Bezug auf die Rückgabe von Methoden ist der Inhalt einer Liste genauso veränderlich. In der Tat, weil Sie Elemente aus einer Liste hinzufügen oder subtrahieren können, würde ich argumentieren, dass dies den Rückgabewert mehr veränderbar macht als ein Array.

Der andere Grund, warum ich Arrays mag, ist, dass ich irgendwann einen kleinen Abschnitt mit performancekritischem Code hatte, also habe ich die Leistungsmerkmale der beiden Benchmarks verglichen und Arrays aus dem Wasser gejagt. Nun, lassen Sie mich dies mit dem Hinweis absprechen, dass es ein enger Test dafür war, wie ich sie in einer bestimmten Situation anwenden würde, und es widerspricht dem, was ich von beiden verstehe, aber die Zahlen waren wild verschieden.

Wie auch immer, hört Jon und Eric =), und ich stimme zu, dass List fast immer mehr Sinn macht.

    
Travis 21.02.2009 21:16
quelle

Tags und Links