none
Можно ли сделать поиск по предикату в списке, класс которого был произведен от System.Collections.CollectionBase ? RRS feed

  • Вопрос

  • Если я определю свой типизированный списочный класс от класса System.Collections.CollectionBase, то можно ли определить в нем функцию поиска элемента по сложному предикату - вроде того, как в классе System.Collections.Generic.List<T> сделан поиск по предикату с помощью семейства методов Find() и FindIndex()? По умолчанию, такой возможности в CollectionBase по моему нет. И ещё - может ли список, созданный из списочного типа, унаследованного от System.Collections.CollectionBase, содержать в качестве своих элементов сложные данные, тип которых представлен пользовательским классом? Или же все списочные типы, производные от System.Collections.CollectionBase, предназначены для хранения простых данных? Подскажите, пожалуйста, кто знает.

    28 июля 2012 г. 11:38

Ответы

  • " то можно ли определить в нем функцию поиска элемента по сложному предикату - вроде того, как в классе System.Collections.Generic.List<T> сделан поиск по предикату с помощью семейства методов Find() и FindIndex()?" - а почему нет, Вы определяете производный класс, и реализация метода не проблема, как говорится - "хозяин - барин". Но с одним "но", это будет метод вашего класса, а не базового, следовательно имея ссылку типа базового класса нельзя будет достучаться до этого метода.

    "И ещё - может ли список, созданный из списочного типа, унаследованного от System.Collections.CollectionBase, содержать в качестве своих элементов сложные данные, тип которых представлен пользовательским классом? Или же все списочные типы, производные от System.Collections.CollectionBase, предназначены для хранения простых данных?" - интерейфейсы которые реализует данный класс, работают с типом object, и поэтому могут работать с любыми типами. Другое дело вопрос безопасного приведения типов и производительности(упаковка и распаковка значимых типов), поэтому лучше смотреть в сторону обобщённых типов.

    • Помечено в качестве ответа TownSparrow 30 июля 2012 г. 9:05
    28 июля 2012 г. 20:18
    Модератор
  • У классов потомков CollectionBase доступен замечательный метод Cast. Благодаря этому методу, вы можете (если все элементы коллекции одного типа или имеют базовым один и тот же тип) привести коллекцию object-ов к нужному типу и выполнять на нем все нужные вам методы из Linq to Object. Например, вы написали коллекцию, в которой храните объекты типа MyClass или его потомки. В этом классе объявлено поле Name. Если объектная переменная содержащая коллекцию будет иметь имя myCollection, то можно будет писать вот такие штуки:

    var testItems = myCollection.Cast<MyClass>().Where(c => c.Name = "test");

    • Помечено в качестве ответа TownSparrow 30 июля 2012 г. 9:05
    29 июля 2012 г. 6:00
    Отвечающий

Все ответы

  • " то можно ли определить в нем функцию поиска элемента по сложному предикату - вроде того, как в классе System.Collections.Generic.List<T> сделан поиск по предикату с помощью семейства методов Find() и FindIndex()?" - а почему нет, Вы определяете производный класс, и реализация метода не проблема, как говорится - "хозяин - барин". Но с одним "но", это будет метод вашего класса, а не базового, следовательно имея ссылку типа базового класса нельзя будет достучаться до этого метода.

    "И ещё - может ли список, созданный из списочного типа, унаследованного от System.Collections.CollectionBase, содержать в качестве своих элементов сложные данные, тип которых представлен пользовательским классом? Или же все списочные типы, производные от System.Collections.CollectionBase, предназначены для хранения простых данных?" - интерейфейсы которые реализует данный класс, работают с типом object, и поэтому могут работать с любыми типами. Другое дело вопрос безопасного приведения типов и производительности(упаковка и распаковка значимых типов), поэтому лучше смотреть в сторону обобщённых типов.

    • Помечено в качестве ответа TownSparrow 30 июля 2012 г. 9:05
    28 июля 2012 г. 20:18
    Модератор
  • У классов потомков CollectionBase доступен замечательный метод Cast. Благодаря этому методу, вы можете (если все элементы коллекции одного типа или имеют базовым один и тот же тип) привести коллекцию object-ов к нужному типу и выполнять на нем все нужные вам методы из Linq to Object. Например, вы написали коллекцию, в которой храните объекты типа MyClass или его потомки. В этом классе объявлено поле Name. Если объектная переменная содержащая коллекцию будет иметь имя myCollection, то можно будет писать вот такие штуки:

    var testItems = myCollection.Cast<MyClass>().Where(c => c.Name = "test");

    • Помечено в качестве ответа TownSparrow 30 июля 2012 г. 9:05
    29 июля 2012 г. 6:00
    Отвечающий
  • Парни, спасибо большое обоим.

    30 июля 2012 г. 9:06