如何转换C#的​​linq WHERE语句?

Him*_*ack 5 c# linq

我有一个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的更多信息


Luk*_*tný 7

literals.Select(x => x as Tag).Where(x => x != null).ToList()
Run Code Online (Sandbox Code Playgroud)

请注意,这将返回新列表.您将无法在此处执行操作并修改原始列表.这也可以这样做:literals.OfType<Tag>().ToList()它将返回IList<Tag>

更新:修改类型