2009-11-19 5 views
4

.NET v2En lecture seule d'une LinkedList. Comment?

Lorsque la liste a une méthode très utile (4 me) AsReadOnly() LinkedList ne dispose pas d'une telle méthode.

Y at-il un moyen d'interfacer "rapidement" un LinkedList interne pour lire seulement à partir du code externe?

Répondre

4

ReadOnlyCollection<T> prend un IList<T> comme argument au constructeur. LinkedList<T> n'implémente pas cette interface. List<T> a une surcharge de constructeur qui prend un IEnumerable<T> comme argument, et LinkedList<T> implémente cette interface. Donc, ce qui suit devrait fonctionner:

LinkedList<int> linked = new LinkedList<int>(); 
// populate the list 

ReadOnlyCollection<int> readOnly = new ReadOnlyCollection<int>(
    new List<int>(linked)); 

Il utilise une instance de List<T> pour transporter les éléments dans le constructeur ReadOnlyCollection<T>.

+0

A travaillé. Merci! – serhio

+1

* ronchonner quelque chose au sujet de vouloir un readonly 'LinkedList' pas' IList' * (la question, pas la réponse) –

+0

Est-ce dommage que dans ce cas je perds les propriétés de la liste Premier et Dernier lien ... – serhio

8

Pourquoi ne pas simplement retourner un IEnumerable<T>? Si vous voulez juste laisser les utilisateurs énumérer la liste sans la modifier *, IEnumerable est le choix évident.

Si vous souhaitez disposer d'une interface en lecture seule de l'interface LinkedList, vous pouvez intégrer LinkedList, transférer les méthodes en lecture seule vers la liste encapsulée et refuser toute modification. *) Gardez à l'esprit que ni ReadOnlyCollection, ni IEnumerable n'empêcheront les appelants de changer l'état des objets dans le cas d'une collection de types de référence. Si les objets doivent également être lus, vous devez implémenter cela dans le cadre de leur type.

+0

pourriez-vous expliquer? – serhio

+0

Je suppose que vous voulez retourner une version en lecture seule de votre LinkedList. Vous pouvez le faire en le renvoyant sous la forme IEnumerable . Cela permettra à l'appelant d'énumérer la liste, mais pas de le modifier. –

+0

et si je garderais les propriétés de liste, comme Premier, Dernier et Suivant ... – serhio

0

LinkedList<T> n'implémente pas IList donc en bref, non, il n'y a aucun moyen de le faire rapidement. Si vous affectez votre LinkedList à une liste, vous perdrez probablement la fonctionnalité dont vous avez besoin.

LinkedList<T> n'offre rien pour le sous-classement, vous devrez donc écrire le vôtre. J'imagine la demande suivante est "pouvez-vous me montrer comment faire cela"

+0

pouvez-vous me montrer comment faire cela? Merci. – serhio

+0

Retourne une liste ok? Ou avez-vous besoin d'être un 'LinkedList' –

+0

Je préfèrerais un * Linked * Readonly List – serhio