.OfType<>() 从基本类型列表中提取派生类型

Dar*_*und 0 c# lambda

我什至不确定是否可以做我想做的事情......但是,我有一个字符列表(Character是基本类型),它包含从Character类型(如WarriorsMages)派生的项目。

继承链是:

Character->Melee->Warrior 

Character->Spellcaster->Mage 
Run Code Online (Sandbox Code Playgroud)

我想在一行代码中提取所有法师和所有战士。

我设法做到了OfType,但无法使用.Where

我试过以下

List<Character> chars = new List<Character>()
{
    new Warrior(),
    new Warrior(),
    new Warrior(),
    new Mage(),
    new Mage(),
    new Mage(),
};

List<Melee> melees = chars.OfType<Melee>().ToList(); // works
List<Melee> melee = chars.Where(c => c is Melee).ToList(); // doesnt work
Run Code Online (Sandbox Code Playgroud)

这是错误

严重性代码说明项目文件行抑制状态错误 CS0029 无法将类型 System.Collections.Generic.List<MagicDestroyers.Characters.Character> 隐式转换为 System.Collections.Generic.List<MagicDestroyers.Characters.Melee.Melee>

显然我需要执行一些类型转换,我只是不知道在哪里做?

编辑:问题是如何通过使用.Where带有的行来获得相同的结果c => c is Melee,因为它很容易阅读。

Sco*_*nen 5

这要求框架弄清楚一点:

List<Melee> melee = chars.Where(c => c is Melee).ToList(); // doesnt work
Run Code Online (Sandbox Code Playgroud)

即使您使用Where过滤掉只有 type 的项目,Melee您过滤的列表也是 type Character。所以无论你如何过滤列表Character,结果都是一个IEnumerable<Character>,或者List<Character>调用之后ToList()

您不能将 a 分配给List<Character>声明为 的变量List<Melee>

你可以做

List<Melee> melee = chars.Where(c => c is Melee).Cast<Melee>().ToList();
Run Code Online (Sandbox Code Playgroud)

但是您使用的前一行OfType更简单明了。OfType正在做同样的事情 - 选择给定类型的元素并将它们转换为该类型。