Comment puis-je exposer seulement un fragment de IList ?

J’ai une propriété de classe exposant un IList interne à travers

System.Collections.ObjectModel.ReadOnlyCollection 

Comment puis-je passer une partie de cette ReadOnlyCollection sans copier les éléments dans un nouveau tableau (j’ai besoin d’une vue en direct et le périphérique cible manque de mémoire)? Je cible le Framework Compact 2.0.

Essayez une méthode qui retourne une énumération en utilisant le rendement:

 IEnumerable FilterCollection( ReadOnlyCollection input ) { foreach ( T item in input ) if ( /* criterion is met */ ) yield return item; } 

Ces exemples foreach conviennent, mais vous pouvez les rendre beaucoup plus concis si vous utilisez .NET 3.5 et LINQ:

 return FullList.Where(i => IsItemInPartialList(i)).ToList(); 

Vous pouvez toujours écrire une classe qui implémente IList et transfère tous les appels à la liste d’origine (elle n’a donc pas sa propre copie des données) après la traduction des index.

Vous pouvez utiliser return return pour créer une liste filtrée.

 IEnumerable FilteredList() { foreach( object item in FullList ) { if( IsItemInPartialList( item ) yield return item; } } 

En fonction de la manière dont vous devez filtrer la collection, vous pouvez créer une classe qui implémente IList (ou IEnumerable, si cela vous convient), mais qui se complique avec l’indexation et l’access pour renvoyer uniquement les valeurs souhaitées. Par exemple

 class EvenList: IList { private IList innerList; public EvenList(IList innerList) { this.innerList = innerList; } public object this[int index] { get { return innerList[2*i]; } set { innerList[2*i] = value; } } // and similarly for the other IList methods } 

Comment faut-il accéder aux éléments filtrés? Si c’est à travers un iterator, vous pourriez peut-être écrire un iterator personnalisé qui ignore les éléments que vous ne voulez pas voir visibles publiquement?

Si vous devez fournir une collection, vous devrez peut-être écrire votre propre classe Collection, qui sert simplement de proxy à la collection sous-jacente, mais empêche l’access aux éléments que vous ne voulez pas voir publiquement.

(Avertissement: je ne suis pas très familier avec C #, ce sont donc des réponses générales. Il peut y avoir des réponses plus spécifiques à C # qui fonctionnent mieux)