У меня есть класс Animal
и его подкласс Dog
.
У меня есть List<Animal>
, и я хочу добавить содержимое некоторого List<Dog>
в List<Animal>
.
Есть ли лучший способ сделать это, чем просто передать List<Dog>
в List<Animal>
, а затем использовать AddRange
?
С# - Как преобразовать List <Dog> в список <Animal>, когда Dog является подклассом Animal?
Ответ 1
Вам не нужен бросок, если вы используете С# 4:
List<Animal> animals = new List<Animal>();
List<Dog> dogs = new List<Dog>();
animals.AddRange(dogs);
Это допустимо, потому что AddRange()
принимает IEnumerable<T>
, который ковариант.
Если у вас нет С# 4, то вам придется перебирать List<Dog>
и бросать каждый элемент, поскольку ковариация была добавлена только тогда. Вы можете выполнить это с помощью метода расширения .Cast<T>
:
animals.AddRange(dogs.Cast<Animal>());
Если у вас даже нет С# 3.5, вам придется делать кастинг вручную.
Ответ 2
Я считаю, что это зависит от того, какую версию .Net вы используете. Я мог ошибаться, но в .Net 4 Я думаю, вы можете сделать
animalList.AddRange(dogList);
В противном случае в .Net 3.5 вы можете сделать
animalList.AddRange(dogList.Select(x => (Animal)x));
Ответ 3
Вы можете использовать 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> ());
EDIT: Как указывает dlev, если вы запускаете фреймворк 4, вам не нужно бросать.