我有一个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>)
似乎失败了。
答案 0 :(得分:5)
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();
请记住,如果源集合的任何元素是空引用,则会失败。