在 C# 中的列表类型之间转换

Posted

技术标签:

【中文标题】在 C# 中的列表类型之间转换【英文标题】:Converting Between List Types in C# 【发布时间】:2014-02-13 01:43:21 【问题描述】:

我有以下课程:

ClassA
ClassB
ClassC

然后全部继承自:

ParentClass

在我的代码中,我有一个名为 MyLists 的属性,它的类型为 Object,声明如下:

Object MyLists = null;  

它的值可以是以下任何一种:

List<ClassA>
List<ClassB>
List<ClassC>

我希望做类似的事情:

foreach(ParentClass o in MyLists)
    //yada yada

但不幸的是,这似乎是不可能的。我收到一个运行时错误说明:

Can't convert from List<ClassA> to List<ParentClass>

我不希望以这样的代码结束:

if(MyLists is List<ClassA>)

    // blah blah

else if(MyLists is List<ClassB>)

    // blah blah

:
:

如何将 MyLists 转换为 List?

谢谢

【问题讨论】:

convert a list of objects from one type to another using lambda expression的可能重复 【参考方案1】:

如果你只需要列举你可以做的值

foreach(var parent in (IEnumerable<ParentClass>)MyLists)


如果将MyLists 的类型更改为IEnumerable&lt;ParentClass&gt;,则可以避免强制转换。

【讨论】:

【参考方案2】:

替换

Object MyLists = null;  

有了这个

IList<ParentClass> MyLists = null;

像这样实例化MyLists

MyLists = new List<ParentClass>();

现在可以添加ParentClassClassA 等实例。

【讨论】:

它创建一个对实现 IList 的类的引用,因此您的 foreach 循环可以编译,您可以插入所有派生类的实例 这不会编译,您不能将 List&lt;Child&gt; 分配给 IList&lt;Parent&gt;,因为 IList&lt;T&gt; 不是协变的。 这是多态性的正确使用。一般来说,在 .NET 中,如果您正在转换,您可能使用了错误的模式。 @Lee 但您可以迭代 List&lt;Child&gt; 并将元素添加到 IList&lt;Parent&gt; 如果 Child : Parent @Lee:因为他只是想迭代 ParentClasses,我的意图是用 List 实例化并添加 ClassA、ClassB 和 ClassC 实例。将编辑我的答案以澄清【参考方案3】:

MyLists的类型改为IEnumerable&lt;ParentClass&gt;。因为IEnumerable&lt;T&gt; 是covariant,所以这可以工作。

IEnumerable<ParentClass> MyLists = null;
// fill it with one of the list types
foreach (var item in MyLists)
    // do something

【讨论】:

【参考方案4】:

假设 MyLists 不是 Object 而是 ParentClass 的 List 您的挑战已经在下面的文章中描述和解决: Convert List<DerivedClass> to List<BaseClass>

【讨论】:

【参考方案5】:

首先将每个列表中的对象转换为 ParentClass。然后,将它们加在一起。然后你可以枚举你的列表:

var castedlistA = listA.Cast<ParentClass>();
var castedlistB = listB.Cast<ParentClass>();
var castedlistC = listC.Cast<ParentClass>();

var fullList = castedListA.AddRange(castedListB).AddRange(castedListC);

foreach (var item in fullList)

    //Do something

【讨论】:

以上是关于在 C# 中的列表类型之间转换的主要内容,如果未能解决你的问题,请参考以下文章

C#中的类型转换

C#实践笔记3.数据类型之间的转换

如何在 C# 中将列表或数组转换为子类型?

简述C#中类型转换的方式

在c#中遍历通用类型列表

c#数据类型转换