2015-01-13 4 views
0

У меня есть серия коллекций типов, все из которых получены из одного и того же базового класса и набора предикатов для поиска каждого из них, например.Обработка нескольких коллекций на основе одного базового типа

public abstract class Animal { ... }  
public class Dog : Animal { ... }  
public class Cat : Animal { ... } 

... 
Func<Dog, bool> DogFinder = ...; 
Func<Cat, bool> CatFinder = ...; 
... 

List<Dog> Dogs = GetDogs(DogFinder); 
List<Cat> Cats = GetCats(CatFinder); 

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

Следующий шаг - взять собак, кошек и преобразовать их в общий тип «Результат» и вернуть коллекцию из них, которая довольно проста, но мне кажется, что повторение посередине должно быть учтено так, что, когда я добавлю больше типов «Животных», они будут масштабироваться чисто.

+0

Вы дали какую-либо мысль к использованию интерфейсов? Это позволит вам сделать что-то вроде «GetAnimal (IAnimal animal)» и, таким образом, сократить избыточность кода по всем направлениям. – Porschiey

ответ

0

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

List<TAnimal> GetAnimals<TAnimal>(Func<TAnimal, bool> predicate) : where TAnimal : Animal 
{ 
    ... 
} 

Тогда вы могли бы просто назвать так:

List<Dog> Dogs = GetAnimals(DogFinder); 
List<Cat> Cats = GetAnimals(CatFinder); 

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

List<Animal> GetAnimals(Func<TAnimal1, TAnimal2, bool> predicate) 
    : where TAnimal1 : Animal 
    : where TAnimal2 : Animal 
{ 
    ... 
} 

Затем вы купите л.д. получить вашу собаку и кошка вместе ж/новый предикат:

Func<Dog, Cat, bool> DogAndCatFinder = ...; 

И получите список, как это:

List<Animal> DogsAndCats = GetAnimals(DogAndCatFinder);