从抽象类型的列表中获取特定类型的所有项
本文关键字:类型 抽象 抽象类 列表 获取 | 更新日期: 2023-09-27 18:24:56
我有一个包含不同类型对象的抽象对象的List<>
。我正在尝试抓取特定类型的所有项目,并将这些项目设置为它们自己的List<>
。
这不起作用-
//myAbstractItems is a List<myAbstractItem>
//typeAList inherents from myAbstractItem
var typeAList = ((List<itemTypeA>)myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).ToList());
强制转换(List<itemTypeA>)
似乎失败。
使用OfType
扩展方法:
var typeAList = myAbstractItems.OfType<itemTypeA>().ToList();
从文档中。。。
OfType(IEnumerable)方法只返回源中可以强制转换为TResult类型的元素。
一个好的旧循环应该是好的:
List<itemTypeA> res = new List<itemTypeA>();
foreach(var item in myAbstractItems)
{
itemTypeA temp = item as itemTypeA;
if (temp != null)
res.Add(temp)
}
尝试以这种方式使用Where
:
var typeAList = myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).Select(item => item as itemTypeA).ToList())
另一种方法是使用OfType()方法:
var typeAList = myAbstractItems.OfType<itemTypeA>().ToList();
这种方法基本上执行以下操作:
var typeAList = myAbstractItems.Where(i=>i is itemTypeA).Select(i=>i as itemTypeA).ToList();
请记住,如果源集合的任何元素是null引用,则此操作将失败。
这将适用于所有itemTypeA
(以及更多派生类型)。
var typeAList = myAbstractItems.Select(i => i as itemTypeA).Where(i => i != null).ToList();
编辑:根据Rawling的评论进行编辑。