C# - 如何将 List 转换为列出,当 Dog 是 Animal 的子类时?

发布于 2024-11-30 16:11:52 字数 287 浏览 3 评论 0 原文

我有一个类 Animal 及其子类 Dog。 我有一个 List,我想将一些 List 的内容添加到 List 中。 除了将 List 转换为 List,然后使用 AddRange 之外,还有更好的方法吗?

I have a class Animal, and its subclass Dog.
I have a List<Animal> and I want to add the contents of some List<Dog> to the List<Animal>.
Is there a better way to do so, than just cast the List<Dog> to a List<Animal>, and then use AddRange?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半夏半凉 2024-12-07 16:11:52

如果使用 C#4,则不需要强制转换:

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

animals.AddRange(dogs);

这是允许的,因为 AddRange() 接受 IEnumerable,即 协变

但是,如果您没有 C#4,则必须迭代 List 并转换每个项目,因为协方差只是在那时添加的。您可以通过 .Cast 扩展方法来完成此操作:

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

如果您甚至没有 C#3.5,则必须手动进行转换。

You don't need the cast if you're using C#4:

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

animals.AddRange(dogs);

That's allowed, because AddRange() accepts an IEnumerable<T>, which is covariant.

If you don't have C#4, though, then you would have to iterate the List<Dog> and cast each item, since covariance was only added then. You can accomplish this via the .Cast<T> extension method:

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

If you don't even have C#3.5, then you'll have to do the casting manually.

り繁华旳梦境 2024-12-07 16:11:52

我相信这取决于您使用的 .Net 版本。我可能错了,但在.Net 4中我认为你可以做

animalList.AddRange(dogList);

否​​则在.Net 3.5中,你可以做

animalList.AddRange(dogList.Select(x => (Animal)x));

I believe this depends on which version of .Net you're using. I could be mistaken, but in .Net 4 I think you can do

animalList.AddRange(dogList);

Otherwise in .Net 3.5, you can do

animalList.AddRange(dogList.Select(x => (Animal)x));
空袭的梦i 2024-12-07 16:11:52

您可以使用 Cast; ()

//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,则不需要进行强制转换。

You can use 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 : As dlev points out, if you run framework 4 you don't need to cast.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文