使用 LINQ 选择通用列表中的元素并将其转换为特定类型

Ext*_*kun 1 linq

我有一个名为 的基类,NodeUpgrade它有几个子类型。特定子类的示例是FactoryUpgrade.

我有一个 NodeUpgrades 列表,它可以是不同子类型的混合。如何编写 linq 查询来检索类型NodeUpgrade并转换为该特定类型?

我的工作查询如下所示:

var allFactories = (from Node n in assets.Nodes
                    from FactoryUpgrade u in n.NodeUpgrades
                    where u.ClassID == NodeUpgradeTypes.Factory
                    select u)
Run Code Online (Sandbox Code Playgroud)

这当然行不通。我可以指定输出的最终类型吗?

Ant*_*ram 5

如果您确定序列中的每个类型都是给定类型,则可以使用Cast<T>()扩展方法。如果列表中可以有多种类型,而您只想要其中一种,则可以使用OfType<T>()过滤序列。

List<Animal> animals = ...

// assumes all animals are cats 
var cats = animals.Cast<Cat>();
// var cats = (from animal in animals where ... select animal).Cast<Cat>();

// or maybe animals can contain dogs, but you don't want them
var cats = animals.OfType<Cat>();
Run Code Online (Sandbox Code Playgroud)

不同之处在于,Cast如果动物不是猫,则会抛出异常,而OfType在实际尝试转换之前会执行类型检查。我赞成Cast在OfType当你有信心,统一型号的。(另请注意,这些不执行用户定义的转换。如果您定义了隐式或显式转换,这些方法将不支持这些转换。)

每种情况下的结果序列都是IEnumerable<Cat>,您可以对它进行进一步的查询操作(过滤器、分组、投影ToList()等)