Pergunta

Eu tenho uma propriedade de classe expondo um IList<> interno por meio

System.Collections.ObjectModel.ReadOnlyCollection<>

Como posso passar uma parte disso ReadOnlyCollection<> sem copiar elementos para um novo array (preciso de uma visualização ao vivo e o dispositivo de destino está com pouca memória)?Estou visando o Compact Framework 2.0.

Foi útil?

Solução

Experimente um método que retorne uma enumeração usando rendimento:

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

Outras dicas

Esses exemplos foreach são bons, embora você possa torná-los muito mais concisos se estiver usando .NET 3.5 e LINQ:

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

Você sempre pode escrever uma classe que implemente IList e encaminhe todas as chamadas para a lista original (para que não tenha sua própria cópia dos dados) após traduzir os índices.

Você poderia usar o retorno de rendimento para criar uma lista filtrada

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

Dependendo de como você precisa filtrar a coleção, você pode querer criar uma classe que implemente IList (ou IEnumerable, se isso funcionar para você), mas que mexa na indexação e no acesso para retornar apenas os valores desejados.Por exemplo

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
}

Como os elementos filtrados precisam ser acessados?Se for por meio de um Iterador, talvez você possa escrever um iterador personalizado que ignore os elementos que você não deseja que sejam visíveis publicamente?

Se você precisar fornecer uma Coleção, talvez seja necessário escrever sua própria classe Collection, que apenas faz proxy para a Coleção subjacente, mas impede o acesso aos elementos que você não deseja que sejam visíveis publicamente.

(Isenção de responsabilidade:Não estou muito familiarizado com C#, então essas são respostas gerais.Pode haver respostas mais específicas para C# que funcionem melhor)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top