将CollectionBase转换为可与Linq一起使用的List或数据类型

时间:2009-10-15 10:08:04

标签: c# .net linq ienumerable ienumerator

我正在使用Aspose单元来操作Excel电子表格。 API中的一种类型是电子表格中的图片集合,它源自CollectionBase:

看到这个链接: http://www.aspose.com/documentation/.net-components/aspose.cells-for-.net/aspose.cells.pictures.html

我想将此类型转换为允许我使用Linq表达式

的内容

有什么选择?

我想我可以迭代它并手动将其添加到new List<Picture> 但是有更好的方法吗?

我读过这个问题 Adding IEnumerable<T> to class derived from CollectionBase

但我显然无法控制实现CollectionBace的类,因为它是第三方产品

1 个答案:

答案 0 :(得分:57)

只需在非通用IEnumerable接口上使用Enumerable.Cast<T>()扩展方法,您可以在查询表达式中隐式执行此操作:

var query = from Picture picture in pictures
            where ...
            select ...;

或明确地,例如,如果您想使用点表示法:

var query = pictures.Cast<Picture>()
                    .Where(...)
                    .Select(...);

Cast<T>()的替代是OfType<T>() - 它基本上忽略了任何不正确类型的元素。在这种情况下,我认为Cast<T>()更合适。

如果你想因任何原因将整个集合转换为List<T>,那也很容易:

List<Picture> list = pictures.Cast<Picture>().ToList();