在 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<ParentClass>
,则可以避免强制转换。
【讨论】:
【参考方案2】:替换
Object MyLists = null;
有了这个
IList<ParentClass> MyLists = null;
像这样实例化MyLists
:
MyLists = new List<ParentClass>();
现在可以添加ParentClass
、ClassA
等实例。
【讨论】:
它创建一个对实现 IListList<Child>
分配给 IList<Parent>
,因为 IList<T>
不是协变的。
这是多态性的正确使用。一般来说,在 .NET 中,如果您正在转换,您可能使用了错误的模式。
@Lee 但您可以迭代 List<Child>
并将元素添加到 IList<Parent>
如果 Child : Parent
@Lee:因为他只是想迭代 ParentClasses,我的意图是用 List将MyLists
的类型改为IEnumerable<ParentClass>
。因为IEnumerable<T>
是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# 中的列表类型之间转换的主要内容,如果未能解决你的问题,请参考以下文章