OfType <>()与Where()扩展中的检查类型之间的区别

ajb*_*ven 7 c# linq

除了可读性之外,以下linq查询之间的区别是什么以及何时以及为什么我将使用其中一个:

IEnumerable<T> items = listOfItems.Where(d => d is T).Cast<T>();
Run Code Online (Sandbox Code Playgroud)

IEnumerable<T> items = listOfItems.OfType<T>();
Run Code Online (Sandbox Code Playgroud)

更新: Dang,抱歉在尝试简化我的问题时介绍了一些错误

Kri*_*izz 8

让我们比较三种方法(注意泛型参数):

  1. listOfItems.Where(t => t is T)调用on IEnumerable<X>仍然会返回IEnumerable<X>刚过滤以仅包含该类型的元素T.

  2. listOfItems.OfType<T>()call on IEnumerable<X>将返回IEnumerable<T>包含可以转换为类型的元素T.

  3. listOfItems.Cast<T>()如果无法转换任何元素,则call on IEnumerable<X>将返回IEnumerable<T>包含已输入的元素T或抛出异常.

并且listOfItems.Where(d => d is T).Cast<T>()基本上做了两次相同的事情 - Where过滤所有T仍然离开类型的元素,IEnumerable<X>然后Cast再次尝试将它们转换为T但是这次返回IEumerable<T>.