Pregunta

Tengo una propiedad de clase que expone una IList<> interna a través de

System.Collections.ObjectModel.ReadOnlyCollection<>

¿Cómo puedo pasar una parte de esto? ReadOnlyCollection<> sin copiar elementos en una nueva matriz (necesito una vista en vivo y el dispositivo de destino tiene poca memoria)?Estoy apuntando a Compact Framework 2.0.

¿Fue útil?

Solución

Pruebe un método que devuelva una enumeración usando rendimiento:

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

Otros consejos

Estos ejemplos de foreach están bien, aunque puedes hacerlos mucho más concisos si usas .NET 3.5 y LINQ:

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

Siempre puedes escribir una clase que implemente IList y reenvíe todas las llamadas a la lista original (para que no tenga su propia copia de los datos) después de traducir los índices.

Podrías usar el retorno de rendimiento para crear una lista filtrada.

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

Dependiendo de cómo necesite filtrar la colección, es posible que desee crear una clase que implemente IList (o IEnumerable, si eso funciona para usted) pero que se entrometa con la indexación y el acceso para devolver solo los valores que desea.Por ejemplo

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
}

¿Cómo se debe acceder a los elementos filtrados?Si es a través de un iterador, ¿tal vez podría escribir un iterador personalizado que omita los elementos que no desea que sean visibles públicamente?

Si necesita proporcionar una Colección, es posible que deba escribir su propia clase Colección, que simplemente representa la Colección subyacente, pero impide el acceso a los elementos que no desea que sean visibles públicamente.

(Descargo de responsabilidad:No estoy muy familiarizado con C#, por lo que estas son respuestas generales.Puede haber respuestas más específicas a C# que funcionen mejor)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top