什么时候在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的对象。