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

时间:2013-07-24 14:44:15

标签: c#

我有一个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>)似乎失败了。

5 个答案:

答案 0 :(得分:5)

使用OfType extension method

var typeAList = myAbstractItems.OfType<itemTypeA>().ToList();

来自文档......

  

OfType(IEnumerable)方法仅返回 source 中可以强制转换为 TResult 类型的元素。

答案 1 :(得分:0)

尝试以这种方式使用Where

var typeAList = myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).Select(item => item as itemTypeA).ToList())

答案 2 :(得分:0)

一个好的旧循环应该没问题:

List<itemTypeA> res = new List<itemTypeA>();
foreach(var item in myAbstractItems)
{
  itemTypeA temp = item as itemTypeA;
  if (temp != null)
    res.Add(temp)
}

答案 3 :(得分:0)

这适用于所有itemTypeA(以及更多派生类型)。

var typeAList = myAbstractItems.Select(i => i as itemTypeA).Where(i => i != null).ToList();

编辑:根据罗林的评论进行编辑。

答案 4 :(得分:0)

另一种方法是使用OfType()方法:

var typeAList = myAbstractItems.OfType<itemTypeA>().ToList();

此方法基本上执行以下操作:

var typeAList = myAbstractItems.Where(i=>i is itemTypeA).Select(i=>i as itemTypeA).ToList();

请记住,如果源集合的任何元素是空引用,则会失败。