我有一个Literal类,Tag继承自它.
我想做以下但我得到了
Unable to cast object of type 'WhereListIterator`1[Core.Literal]' to type 'System.Collections.Generic.List`1[Core.Tag]'.
private List<Literal> literals;
public List<Tag> Tags
{
get { return (List<Tag>)literals.Where(x => x is Tag); }
}
Run Code Online (Sandbox Code Playgroud)
谢谢
Jos*_*ers 24
你会做得更好:
literals.OfType<Tag>().ToList();
Run Code Online (Sandbox Code Playgroud)
这给你一个List<Tag>
.
你也可以这样做:
var asList = new List<Tag>(literals.OfType<Tag>());
Run Code Online (Sandbox Code Playgroud)
转换根本不起作用,因为LINQ无论是使用List IEnumerable<T>
还是IQueryable<T>
使用List作为结果的后备实现.我张贴的第二种方法是使用一个构造过载List<T>
在所涉及的花费IEnumerable<T>
为对象的初始集合.同样在这种情况下OfType<T>
,LINQ 中的方法是一种更清晰,更简洁的基本上过滤列表的形式Where(x -> x is T)
.
此外,OfType<T>
在这种情况下是一个更好的主意,因为结果是IEnumerable<T>
您的目标类型. Where(x => x is T)
将返回IEnumerable<T>
原始源的类型.这就是为什么(List<Tag>)literals.Where(x => x is Tag).ToList()
为无效的强制转换发出错误的原因.
有关ToList的更多信息
有关OfType的更多信息
literals.Select(x => x as Tag).Where(x => x != null).ToList()
Run Code Online (Sandbox Code Playgroud)
请注意,这将返回新列表.您将无法在此处执行操作并修改原始列表.这也可以这样做:literals.OfType<Tag>().ToList()
它将返回IList<Tag>
更新:修改类型