我甚至不确定它是否有可能做我想做的事情......
但是,我有一个字符列表(Character
是基本类型),它包含从Character
类型派生的项目(如Warriors
和Mages
)。
继承链是:
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;
显然我需要进行一些类型转换,我只是想弄清楚在哪里做?
编辑:问题是如何使用.Where
行c => c is Melee
来获得相同的结果,因为它很容易阅读。
答案 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();