Как я могу выставить только фрагмент IList <>?

У меня есть свойство класса, отображающее внутренний IList < > через

System.Collections.ObjectModel.ReadOnlyCollection<>

Как я могу передать часть этого ReadOnlyCollection<> без копирования элементов в новый массив (мне нужен живой просмотр, а целевое устройство - короткое по памяти)? Я нацелен на Compact Framework 2.0.

Ответ 1

Попробуйте метод, который возвращает перечисление с использованием yield:

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

Ответ 2

Эти образцы foreach хороши, хотя вы можете сделать их намного более краткими, если вы используете .NET 3.5 и LINQ:

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

Ответ 3

Вы всегда можете написать класс, который реализует IList и переадресовывает все вызовы в исходный список (поэтому он не имеет собственной копии данных) после перевода индексов.

Ответ 4

Вы можете использовать возврат доход для создания отфильтрованного списка

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

Ответ 5

В зависимости от того, как вам нужно фильтровать коллекцию, вам может понадобиться создать класс, который реализует IList (или IEnumerable, если это работает для вас), но это связано с индексированием и доступом только к возвращаемым значениям. Например

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
}

Ответ 6

Как нужно, чтобы отфильтрованные элементы были доступны? Если через Iterator, возможно, вы могли бы написать собственный итератор, который пропускает элементы, которые вы не хотите публично видимым?

Если вам нужно предоставить коллекцию, вам может понадобиться написать собственный класс Collection, который просто проксирует к основной коллекции, но предотвращает доступ к элементам, которые вы не хотите публично видимым.

(Отказ от ответственности: я не очень хорошо знаком с С#, так что это общие ответы. На С# могут быть более конкретные ответы, которые работают лучше)