【问题标题】:Get all items of a certain type from a List of abstract type从抽象类型列表中获取特定类型的所有项目
【发布时间】:2021-08-24 13:02:19
【问题描述】:

我有一个包含不同类型对象的抽象对象List<>。 我正在尝试获取某种类型的所有项目并将这些项目设置为它们自己的List<>

这不起作用 -

//myAbstractItems is a List<myAbstractItem>
//typeAList inherents from myAbstractItem


var typeAList = ((List<itemTypeA>)myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).ToList());

(List&lt;itemTypeA&gt;) 的强制转换似乎失败了。

【问题讨论】:

  • 获取itemTypeA类型的元素或派生类型或获取itemTypeA的元素确切是否重要?

标签: c#


【解决方案1】:

尝试以这种方式使用Where

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

【讨论】:

  • 代替最后一个Select,您可以也可以使用.Cast&lt;itemTypeA&gt;()
【解决方案2】:

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

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

【讨论】:

  • 这与(尝试的)原始代码略有不同,因为它将返回任何可以分配为itemTypeA 的东西,而不仅仅是那种 exact 类型的东西。
  • 你是对的,但是问题中的代码和问题是模棱两可的^^
  • 是的,抱歉,我的意思是在我的评论中添加您的版本很可能是 OP 想要的:p
【解决方案3】:

使用OfType extension method

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

来自文档...

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

【讨论】:

  • 伟大的答案培根!谢谢!
  • 为了完整起见,此解决方案具有以下(良好)属性: (1) 来自itemTypeA派生 类型的元素也是列入新名单。 (这里 itemTypeA 被称为 class 类型。如果它是泛型接口类型、泛型委托类型或数组类型,还将考虑协变和/或逆变。)(2) 任何没有运行时类型的null 条目包含在新列表中。
【解决方案4】:

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

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

编辑:根据 Rawling 的评论进行编辑。

【讨论】:

  • 为什么不将Select 放在Where 之前而不执行as 转换两次?
【解决方案5】:

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

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

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

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

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

【讨论】:

  • 最后一个例子会给出List&lt;TheAbstractType&gt;,而不是List&lt;itemTypeA&gt;,这就是原始海报所说的。不过,有趣的是要记住 null 项目会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2022-08-15
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多