我有一个班级Animal
及其子类Dog
。
我有一个List<Animal>
,我想将一些List<Dog>
的内容添加到List<Animal>
。
有没有更好的方法,只需将List<Dog>
转换为List<Animal>
,然后使用AddRange
?
答案 0 :(得分:16)
如果您使用C#4,则不需要演员:
List<Animal> animals = new List<Animal>();
List<Dog> dogs = new List<Dog>();
animals.AddRange(dogs);
这是允许的,因为AddRange()
接受IEnumerable<T>
,covariant。
如果你没有C#4,那么你必须迭代List<Dog>
并投射每个项目,因为协方差只是添加了。您可以通过.Cast<T>
扩展程序完成此操作:
animals.AddRange(dogs.Cast<Animal>());
如果你甚至没有C#3.5,那么你必须手动进行投射。
答案 1 :(得分:5)
我认为这取决于您使用的.Net版本。我可能会弄错,但在.Net 4中我认为你可以做到
animalList.AddRange(dogList);
否则在.Net 3.5中,你可以做到
animalList.AddRange(dogList.Select(x => (Animal)x));
答案 2 :(得分:2)
您可以使用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,则不需要强制转换。