Come posso esporre solo un frammento di IList<>?
-
09-06-2019 - |
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.
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)