除了可读性之外,以下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,抱歉在尝试简化我的问题时介绍了一些错误
让我们比较三种方法(注意泛型参数):
listOfItems.Where(t => t is T)调用on IEnumerable<X>仍然会返回IEnumerable<X>刚过滤以仅包含该类型的元素T.
listOfItems.OfType<T>()call on IEnumerable<X>将返回IEnumerable<T>包含可以转换为类型的元素T.
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>.