2008-09-02 10 views
10

que tienen una propiedad de clase exponiendo un IList interna <> a través¿Cómo puedo exponer solo un fragmento de IList <>?

System.Collections.ObjectModel.ReadOnlyCollection<> 

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

Respuesta

14

probar un método que devuelve una enumeración utilizando rendimiento:

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

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

1

Se puede usar yield return para crear una lista filtrada

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

¿De qué manera los elementos filtrados se necesita acceder? Si se trata de un iterador, entonces ¿podría escribir un iterador personalizado que omita los elementos que no quiere que sean públicamente visibles?

Si necesita proporcionar una Colección, puede necesitar escribir su propia clase de Colección, que solo se aproxima a la Colección subyacente, pero impide el acceso a los elementos que no desea que sean públicamente visibles.

(Negación: No estoy muy familiarizado con C#, por lo que éstas son respuestas generales Puede haber respuestas más específicas a C# que funcionan mejor.)

1

Dependiendo de cómo necesite filtrar la colección, es posible que desee crear una clase que implemente IList (o IEnumerable, si eso le funciona) pero que se arruina con la indexación y el acceso para devolver solo los valores que querer. 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 
} 
8

Estas muestras foreach están muy bien, aunque se puede hacerlos mucho más concisa si está utilizando .NET 3.5 y LINQ:

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