Вопрос

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

System.Collections.ObjectModel.ReadOnlyCollection<>

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

В зависимости от того, как вам нужно отфильтровать коллекцию, вы можете захотеть создать класс, который реализует 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
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top