2009-02-21 9 views
7

J'ai une classe Customer (avec des propriétés client typiques) et j'ai besoin de transmettre, et databind, un "morceau" de Customer instances. Actuellement, j'utilise un tableau de Customer, mais j'ai aussi utilisé Collection de T (et List de T avant de savoir Collection de T). Je voudrais le moyen le plus mince de passer ce morceau en utilisant C# et .NET 3.5.ArrayList par rapport à un tableau d'objets par rapport à la collection de T

Actuellement, le tableau de Customer fonctionne très bien pour moi. Les données se lient bien et semblent être aussi légères que possible. Je n'ai pas besoin des trucs List de T offres et Collection de T semble toujours comme exagéré. Le tableau exige que je sache à l'avance combien de Customer je suis en train d'ajouter au morceau, mais je le sais toujours à l'avance (en fonction des lignes d'une page, par exemple).

Est-ce que je manque quelque chose de fondamental ou est le tableau de Customer OK? Y a-t-il un compromis que je manque?

En outre, je suppose que Collection de T rend obsolète l'ancien ArrayList lâche-typé. Suis-je juste là?

Répondre

4

Personne n'a mentionné les conseils directives Cadre: Don't use List<T> in public API's:

Nous ne recommandons pas d'utiliser la liste dans API publiques pour deux raisons.

  • List<T> n'est pas conçu pour être étendu. c'est-à-dire que vous ne pouvez remplacer aucun membre . Cela signifie par exemple qu'un objet renvoyant List<T> à partir d'une propriété ne pourra pas être notifié lorsque la collection est modifiée. Collection<T> permet de remplacer membre SetItem protégé pour obtenir "notifié" lorsqu'un nouveau élément est ajouté ou un élément existant est modifié.

  • La liste contient beaucoup de membres qui ne sont pas pertinents dans de nombreux scénarios. Nous dire que List<T> est trop "occupé" pour modèles d'objets publics. Imaginez propriété ListView.Items renvoyant List<T> avec toute sa richesse. Maintenant, regarder le ListView.Items type de retour; il est plus simple et similaire à Collection<T> ou ReadOnlyCollection<T>

De plus, si votre objectif est Databinding dans les deux sens, jetez un oeil à BindingList<T> (avec la mise en garde que ce n'est pas sortable « de la boîte '!)

11

Oui, Collection<T> (ou List<T> plus commun) rend ArrayList quasiment obsolète. En particulier, je crois ArrayList n'est même pas pris en charge dans Silverlight 2.

Les tableaux sont corrects dans certains cas, mais devraient être considered somewhat harmful - ils ont divers inconvénients. (Ils sont au cœur de la mise en œuvre de la plupart des collections, bien sûr ...) J'irais dans plus de détails, mais Eric Lippert le fait tellement mieux que je ne pourrais jamais dans l'article référencé par le lien. Je le résumerais ici, mais c'est assez difficile à faire. Cela vaut vraiment la peine de lire tout le message.

+0

Il fait un excellent travail dans cet article, une bonne lecture pour ceux qui ne l'ont pas déjà fait. –

3

En général, vous devriez « passer autour » IEnumerable <T> ou ICollection <T> (selon qu'il est logique pour votre consommation pour ajouter des éléments).

0

Je vais présenter un argument dissident à Jon et Eric Lippert, ce qui signifie que vous devriez être très fatigué de ma réponse, en effet!).

Le cœur des arguments d'Eric Lippert contre les tableaux est que le contenu est immuable, contrairement à la structure de données elle-même. En ce qui concerne le retour des méthodes, le contenu d'une liste est tout aussi modifiable. En fait, parce que vous pouvez ajouter ou soustraire des éléments d'une liste, je dirais que cela rend la valeur de retour plus mutable qu'un tableau. L'autre raison pour laquelle j'adore Arrays est qu'il y a quelque temps j'avais une petite section de code critique de performance, donc j'ai comparé les caractéristiques de performance des deux, et les tableaux ont soufflé hors de l'eau. Maintenant, permettez-moi de préciser ceci en disant que c'était un test étroit pour savoir comment j'allais les utiliser dans une situation spécifique, et cela va à l'encontre de ce que je comprends des deux, mais les chiffres étaient très différents. Quoi qu'il en soit, écoutez Jon et Eric =), et je suis d'accord que List a presque toujours plus de sens.

+0

Il y a certainement des endroits où il est logique d'utiliser des tableaux, et ils seront en effet plus performants. C'est une raison de les utiliser * où la performance est critique * (ce qui n'est pas beaucoup d'endroits IME).Pour l'argument de l'immutabilité: si vous déclarez qu'une méthode retourne Foo [] alors elle sera * toujours * mutable. –

+0

Si, d'autre part, vous déclarez qu'il renvoie IList alors la valeur retournée * peut * être mutable ou * peut * être immuable - et vous pouvez très facilement créer un wrapper en lecture seule. Ce n'est pas tellement un cas de "tableau vs Liste " que "tableau vs une interface" pour les types de retour. –

+0

Vous ne pouvez pas retourner un tableau de IImmutableObject [], cependant? Je n'essaie pas d'être argumentatif, mais cet argument n'a jamais eu de sens pour moi. (Dans le cas où quelqu'un trouve mon argument convaincant, veuillez utiliser la liste , comme c'est la bonne chose à faire dans 99,9% des cas). – Travis

0

Je suis d'accord avec Alun, avec une addition. Si vous souhaitez adresser la valeur renvoyée par myArray [n], utilisez un IList.

Un tableau prend en charge intrinsèquement IList (ainsi que IEnumerable et ICollection, d'ailleurs). Donc, si vous passez par l'interface, vous pouvez toujours utiliser le tableau comme structure de données sous-jacente. De cette façon, les méthodes que vous passez le tableau dans ne pas « savoir » que la structure de données sous-jacente est un tableau:

 public void Test() 
{ 
    IList<Item> test = MyMethod(); 
} 

public IList<Item> MyMethod() 
{ 
    Item[] items = new Item[] {new Item()}; 
    return items; 
} 
1

Si vous avez une liste immuable des clients, ce qui est ... Votre liste de clients ne changera pas, elle est relativement petite, et vous la parcourrez toujours en premier et vous n'aurez pas besoin d'ajouter ou de retirer de la liste, alors un tableau est probablement très bien.

Si vous n'êtes pas sûr, cependant, votre meilleur pari est une collection d'un certain type. La collection que vous choisissez dépend des opérations que vous souhaitez effectuer. Les collections portent toutes sur les insertions, les manipulations, les recherches et les suppressions. Si vous faites fréquemment des recherches fréquentes pour un élément donné, alors un dictionnaire peut être le meilleur. Si vous avez besoin de trier les données, alors une liste triée fonctionnera peut-être mieux.

Je ne m'inquiéterais pas de "léger", sauf si vous parlez d'un grand nombre d'éléments, et même alors, les avantages des recherches O (1) l'emportent sur les coûts des ressources. Lorsque vous "passez" une collection, vous ne faites que passer une référence, qui est essentiellement un pointeur. Il n'y a donc pas de différence de performance entre le passage d'une collection et un tableau.

Questions connexes