Question

J'ai une propriété de classe exposant un IList<> interne via

System.Collections.ObjectModel.ReadOnlyCollection<>

Comment puis-je transmettre une partie de ceci ReadOnlyCollection<> sans copier des é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 Compact Framework 2.0.

Était-ce utile?

La solution

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

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

Autres conseils

Ces exemples foreach conviennent, même si 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 transmet tous les appels à la liste d'origine (afin qu'elle ne dispose pas de sa propre copie des données) après avoir traduit les index.

Vous pouvez utiliser le retour de rendement pour créer une liste filtrée

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

Selon la façon dont vous devez filtrer la collection, vous souhaiterez peut-être créer une classe qui implémente IList (ou IEnumerable, si cela fonctionne pour vous), mais qui se moque de l'indexation et de l'accès 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 accéder aux éléments filtrés ?Si c'est via un itérateur, vous pourriez peut-être écrire un itérateur personnalisé qui ignore les éléments que vous ne souhaitez pas voir publiquement ?

Si vous devez fournir une collection, vous devrez peut-être écrire votre propre classe Collection, qui ne fait que proxy la collection sous-jacente, mais empêche l'accès aux éléments que vous ne souhaitez pas voir publiquement.

(Clause de non-responsabilité:Je ne connais pas très bien C#, ce sont donc des réponses générales.Il peut y avoir des réponses plus spécifiques au C# qui fonctionnent mieux)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top