.OfType<>()从基本类型列表

时间:2018-02-06 00:24:34

标签: c# lambda

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

继承链是:

Character->Melee->Warrior 

Character->Spellcaster->Mage 

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

我设法使用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

这是错误

  

严重级代码描述项目文件行抑制状态   错误CS0029无法隐式转换类型   System.Collections.Generic.List&LT; MagicDestroyers.Characters.Character&GT;   至   System.Collections.Generic.List&LT; MagicDestroyers.Characters.Melee.Melee&GT;

显然我需要进行一些类型转换,我只是想弄清楚在哪里做?

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

2 个答案:

答案 0 :(得分:4)

这要求框架弄清楚一点:

List<Melee> melee = chars.Where(c => c is Melee).ToList(); // doesnt work

即使您使用Where过滤掉仅属于Melee类型的项目,您要过滤的列表也属于Character类型。因此,无论您如何过滤Character列表,调用IEnumerable<Character>后结果为List<Character>ToList()

您无法将List<Character>分配给声明为List<Melee>的变量。

你可以做到

List<Melee> melee = chars.Where(c => c is Melee).Cast<Melee>().ToList();

但您使用OfType的上一行更简单,更清晰。 OfType正在做同样的事情 - 选择给定类型的元素并将它们作为该类型进行转换。

答案 1 :(得分:1)

你真的没有一个明确的问题,因为你的第一个例子工作正常,但是如果你 使用.Where()那么你只需要事后调用Cast<T>()

  

我想在2个单独的和/和

列表中分发战士和法师

因此,我选择OfType(),因为它更直接。

List<Melee> melees = chars.OfType<Melee>().ToList(); 
// or
List<Melee> melees = chars.Where(c => c is Melee).Cast<Melee>().ToList();