从抽象类型的列表中获取特定类型的所有项

本文关键字:类型 抽象 抽象类 列表 获取 | 更新日期: 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的评论进行编辑。