0

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

4

5 回答 5

5

使用OfType扩展方法

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

从文档...

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

于 2013-07-24T14:49:00.203 回答
0

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

List<itemTypeA> res = new List<itemTypeA>();
foreach(var item in myAbstractItems)
{
  itemTypeA temp = item as itemTypeA;
  if (temp != null)
    res.Add(temp)
}
于 2013-07-24T14:47:01.297 回答
0

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

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

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

于 2013-07-24T14:50:04.673 回答
0

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

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

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

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

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

于 2013-07-24T14:53:35.817 回答
0

尝试使用Where这种方式:

var typeAList = myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).Select(item => item as itemTypeA).ToList())
于 2013-07-24T14:45:55.183 回答