Как я могу выставить только фрагмент IList <>? - PullRequest
10 голосов
/ 02 сентября 2008

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

System.Collections.ObjectModel.ReadOnlyCollection<>

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

Ответы [ 6 ]

15 голосов
/ 02 сентября 2008

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

IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
    foreach ( T item in input )
        if (  /* criterion is met */ )
            yield return item;
}
8 голосов
/ 02 сентября 2008

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

return FullList.Where(i => IsItemInPartialList(i)).ToList();
1 голос
/ 02 сентября 2008

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

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

IEnumerable<object> FilteredList()
{
    foreach( object item in FullList )
    {
        if( IsItemInPartialList( item )
            yield return item;
    }
}
1 голос
/ 02 сентября 2008

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

0 голосов
/ 02 сентября 2008

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

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

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

...