Domanda

Ho una proprietà di classe che espone un IList interno<> attraverso

System.Collections.ObjectModel.ReadOnlyCollection<>

Come posso trasmetterne una parte? ReadOnlyCollection<> senza copiare gli elementi in un nuovo array (ho bisogno di una visualizzazione live e il dispositivo di destinazione ha poca memoria)?Sto prendendo di mira Compact Framework 2.0.

È stato utile?

Soluzione

Prova un metodo che restituisce un'enumerazione utilizzando yield:

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

Altri suggerimenti

Questi esempi foreach vanno bene, anche se puoi renderli molto più concisi se usi .NET 3.5 e LINQ:

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

Puoi sempre scrivere una classe che implementa IList e inoltra tutte le chiamate all'elenco originale (quindi non ha la propria copia dei dati) dopo aver tradotto gli indici.

Potresti utilizzare yield return per creare un elenco filtrato

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

A seconda di come devi filtrare la raccolta, potresti voler creare una classe che implementa IList (o IEnumerable, se funziona per te) ma che si occupa dell'indicizzazione e dell'accesso per restituire solo i valori desiderati.Per esempio

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
}

Come è necessario accedere agli elementi filtrati?Se avviene tramite un iteratore, forse potresti scrivere un iteratore personalizzato che salti gli elementi che non vuoi che siano visibili pubblicamente?

Se è necessario fornire una raccolta, potrebbe essere necessario scrivere la propria classe Collection, che si limita a fungere da proxy per la raccolta sottostante, ma impedisce l'accesso agli elementi che non si desidera siano visibili pubblicamente.

(Disclaimer:Non ho molta familiarità con C#, quindi queste sono risposte generali.Potrebbero esserci risposte più specifiche a C# che funzionano meglio)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top