Применение автоматической и скрытой фильтрации к списку <T> - PullRequest
0 голосов
/ 25 января 2011

ОК.

У меня есть класс MyClass и другой класс, основанный на List.Давайте назовем это MyCollection.

Теперь, когда кто-то печатает:

MyCollection coll = new MyCollection();
...
coll.Find(...)

Они действуют на всю коллекцию.Я хочу применить некоторую фильтрацию - за кулисами - так, чтобы, если они пишут вышеуказанный код, то, что на самом деле выполняет, было бы чем-то вроде ...

coll.Where(x=>x.CanSeeThis).Find(...)

Что мне нужно написатьв определении класса MyCollection, чтобы сделать эту работу?

Можно ли сделать эту работу?

Ответы [ 2 ]

3 голосов
/ 25 января 2011

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

1 голос
/ 25 января 2011

Вы уже упоминали, что у вас есть собственная коллекция, вероятно, полученная из списка, верно?Затем вам нужно будет создать свой собственный метод для поиска:

public class MyList<T> : System.Collections.Generic.List<T>
{
  public IEnumerable<T> MyFind(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }
}

К сожалению, это необходимо, потому что вы не можете переопределить метод Find в List напрямую.Однако вы можете использовать ключевое слово 'new', чтобы указать, что если вы получили ссылку на экземпляр MyList, он будет использовать эту реализацию find, как показано ниже:

  public new IEnumerable<T> Find(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }

Однако приведенный выше пример даст:

MyCollection<int> collection = new ...
collection.Find(myPredicate); // <= Will use YOUR Find-method

List<int> baseTypeCollection = collection; // The above instantiated
baseTypeCollection.Find(myPredicate); // Will use List<T>.Find!

Так что лучше сделать свой собственный метод.

...