什么时候在Linq中使用Cast()和Oftype()

我知道两种从Linq的Arraylist中将types转换为IEnumerable方法,并想知道在哪些情况下使用它们?

例如

 IEnumerable<string> someCollection = arrayList.OfType<string>() 

要么

 IEnumerable<string> someCollection = arrayList.Cast<string>() 

这两种方法有什么区别,我应该在哪里应用每种情况?

OfType – 只返回types为x的元素。
Cast – 将尝试将所有元素转换为xtypes。 如果其中一些不是这种types的,你将得到InvalidCastException

编辑
例如:

 object[] objs = new object[] { "12345", 12 }; objs.Cast<string>().ToArray(); //throws InvalidCastException objs.OfType<string>().ToArray(); //return { "12345" } 

http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/

基本上,Cast()是这样实现的:

 public IEnumerable<T> Cast<T>(this IEnumerable source) { foreach(object o in source) yield return (T) o; } 

使用显式转换可以很好地执行,但如果转换失败,将导致InvalidCastException。 这个想法效率较低但有用的变体是OfType():

 public IEnumerable<T> OfType<T>(this IEnumerable source) { foreach(object o in source) if(o is T) yield return (T) o; } 

返回的枚举将只包含可以安全地转换为指定types的元素。

你应该调用Cast<string>()如果你知道所有的项目都是string s。
如果其中一些不是string,你会得到一个exception。

你应该调用OfType<string>()如果你知道一些项目不是string s,你不想要这些项目。
如果其中一些不是string,它们将不在新的IEnumerable<string>

需要注意的是Cast(Of T)可以在IEnumerable上使用,不像其他的LINQ函数,所以如果有一种情况你需要在非generics的集合或列表上使用LINQ(比如ArrayList),你可以使用Cast的T)投到一个IEnumerable(的T)在LINQ可以工作。

Cast()将尝试转换集合的所有元素(并且如果元素的types是错误的,将抛出一个exception),而OfType()只返回适当types的元素。

OfType将过滤元素以仅返回指定types的元素。 如果元素不能转换为目标types,Cast将会崩溃。

演员将尝试将所有项目转换为给定typesT.此演员表可能会失败或抛出exception。 OfType将返回原始集合的一个子集,并只返回types为T的对象。