У меня есть класс 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, вам не нужно бросать.