将已填充的List<BaseClass>转换为List<ChildClass>

14

我有一个成员是基类对象的List<BaseClass>,我想将该列表(以及其所有成员)转换为类型为List<ChildClass>的列表,其中ChildClass继承自BaseClass。 我知道可以通过foreach得到相同的结果:

List<ChildClass> ChildClassList = new List<ChildClass>();
foreach( var item in BaseClassList )
{
    ChildClassList.Add( item as ChildClass );
}

但是是否有更简洁的方法来做到这一点?注意 - 这是在WP7平台上完成的。

2个回答

23

如果您确信所有项目都可以转换类型,那么可以这样做:

ChildClassList = BaseClassList.Cast<ChildClass>().ToList();

如果不能将一个BaseClass的项强制转换为ChildClass,您当前的代码会添加null。如果这确实是您的意图,那么等效的代码如下:

ChildClassList = BaseClassList.Select(x => x as ChildClass).ToList();

我建议使用这种方法,它会进行类型检查,并跳过不匹配的项:

ChildClassList = BaseClassList.OfType<ChildClass>().ToList();

谢谢 - 在这种情况下,我确定每个元素都是指定类型。我将我的模型分成“愚蠢”(仅属性)和“聪明”(所有功能)版本,在其中聪明的类继承了愚蠢的类。这里的第一个例子就像它应该的那样工作了 - 感谢您的帮助!同样感谢@Adam Houldsworth。 - Kris Selbekk

5
以下代码与您当前的代码几乎相同(唯一缺失的是它不会为失败的转换添加 null 值):
var childList = baseList.OfType<ChildClass>().ToList();

这将忽略列表中包含除 ChildClass 以外的其他派生类实例。

你也可以使用:

var childList = baseList.Cast<ChildClass>().ToList();

但是当它无法转换时,这会抛出一个InvalidCastException异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接