Как преобразовать список <Dog>в список <Animal>, когда собака является подклассом животных? - PullRequest
11 голосов
/ 18 августа 2011

У меня есть класс Animal и его подкласс Dog. У меня есть List<Animal>, и я хочу добавить содержимое некоторых List<Dog> к List<Animal>. Есть ли лучший способ сделать это, чем просто привести List<Dog> к List<Animal>, а затем использовать AddRange?

Ответы [ 3 ]

16 голосов
/ 18 августа 2011

Вам не нужен приведение, если вы используете C # 4:

List<Animal> animals = new List<Animal>();
List<Dog> dogs = new List<Dog>();

animals.AddRange(dogs);

Это разрешено, потому что AddRange() принимает IEnumerable<T>, что ковариантно .

Если у вас нет C # 4, тогда вам придется итерировать List<Dog> и разыгрывать каждый элемент, поскольку ковариация была добавлена ​​только тогда.Это можно сделать с помощью метода расширения .Cast<T>:

animals.AddRange(dogs.Cast<Animal>());

Если у вас даже нет C # 3.5, вам придется выполнять приведение вручную.

5 голосов
/ 18 августа 2011

Я считаю, что это зависит от того, какую версию .Net вы используете.Я могу ошибаться, но в .Net 4 я думаю, вы можете сделать

animalList.AddRange(dogList);

В противном случае в .Net 3.5 вы можете сделать

animalList.AddRange(dogList.Select(x => (Animal)x));
2 голосов
/ 18 августа 2011

Вы можете использовать Cast<T> ()

//You must have using System.Linq;

List<Dog> dogs = new List<Dog> ();
List<Animal> animals = new List<Animal> ();
animals.AddRange (dogs.Cast<Animal> ());

РЕДАКТИРОВАТЬ: Как указывает dlev, если вы запускаете фреймворк 4, вам не нужно разыгрывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...