我知道有两种从Linq中的Arraylist转换类型为IEnumerable的方法,我想知道在哪些情况下使用它们?例如
Arraylist
IEnumerable
IEnumerable<string> someCollection = arrayList.OfType<string>()
或
IEnumerable<string> someCollection = arrayList.Cast<string>()
这两种方法之间有什么区别,我应该在哪里应用每种情况?
6mzjoqzu1#
OfType-只返回可以安全地转换为x类型的元素。Cast-将尝试将所有元素转换为类型x。如果其中一些不属于此类型,则会得到InvalidCastException
OfType
Cast
InvalidCastException
编辑
例如:
object[] objs = new object[] { "12345", 12 }; objs.Cast<string>().ToArray(); //throws InvalidCastException objs.OfType<string>().ToArray(); //return { "12345" }
093gszye2#
来源:LINQ Tip: Enumerable.OfType - Solutionizing .NET基本上,Cast<T>()是这样实现的:
Cast<T>()
public IEnumerable<T> Cast<T>(this IEnumerable source) { foreach(object o in source) yield return (T) o; }
使用显式强制转换性能良好,但如果强制转换失败,将导致InvalidCastException。这个想法的一个效率较低但有用的变体是OfType<T>():
OfType<T>()
public IEnumerable<T> OfType<T>(this IEnumerable source) { foreach(object o in source) if(o is T t) yield return t; }
返回的枚举将只包括可以安全地强制转换为指定类型的元素。
ie3xauqp3#
如果你知道所有的项目都是string,你应该调用Cast<string>()。如果其中一些不是字符串,你会得到一个异常。如果您知道某些项不是string s并且您不需要这些项,则应该调用OfType<string>()。如果其中一些不是字符串,它们将不会出现在新的IEnumerable<string>中。
string
Cast<string>()
OfType<string>()
IEnumerable<string>
dly7yett4#
应该注意的是,Cast(Of T)可以在IEnumerable上使用,这与其他LINQ函数不同,因此如果您需要在非泛型集合或列表(如ArrayList)上使用LINQ,则可以使用Cast(Of T)强制转换为LINQ可以工作的IEnumerable(Of T)。
Cast(Of T)
ArrayList
IEnumerable(Of T)
v6ylcynt5#
Cast()将尝试强制转换集合中的所有元素(如果元素的类型错误,则会引发异常),而OfType()将仅返回正确类型的元素。
Cast()
OfType()
xxls0lw86#
OfType将过滤元素,只返回指定类型的元素。Cast将崩溃,如果一个元素不能被转换为目标类型。
bsxbgnwa7#
Cast<T>将尝试将所有项强制转换为给定类型T。此强制转换可能失败或引发异常。OfType<T>将返回原始集合的一个子集,并且只返回T类型的对象。
Cast<T>
T
OfType<T>
7条答案
按热度按时间6mzjoqzu1#
OfType
-只返回可以安全地转换为x类型的元素。Cast
-将尝试将所有元素转换为类型x。如果其中一些不属于此类型,则会得到InvalidCastException
编辑
例如:
093gszye2#
来源:LINQ Tip: Enumerable.OfType - Solutionizing .NET
基本上,
Cast<T>()
是这样实现的:使用显式强制转换性能良好,但如果强制转换失败,将导致
InvalidCastException
。这个想法的一个效率较低但有用的变体是OfType<T>()
:返回的枚举将只包括可以安全地强制转换为指定类型的元素。
ie3xauqp3#
如果你知道所有的项目都是
string
,你应该调用Cast<string>()
。如果其中一些不是字符串,你会得到一个异常。
如果您知道某些项不是
string
s并且您不需要这些项,则应该调用OfType<string>()
。如果其中一些不是字符串,它们将不会出现在新的
IEnumerable<string>
中。dly7yett4#
应该注意的是,
Cast(Of T)
可以在IEnumerable
上使用,这与其他LINQ函数不同,因此如果您需要在非泛型集合或列表(如ArrayList
)上使用LINQ,则可以使用Cast(Of T)
强制转换为LINQ可以工作的IEnumerable(Of T)
。v6ylcynt5#
Cast()
将尝试强制转换集合中的所有元素(如果元素的类型错误,则会引发异常),而OfType()
将仅返回正确类型的元素。xxls0lw86#
OfType
将过滤元素,只返回指定类型的元素。Cast
将崩溃,如果一个元素不能被转换为目标类型。bsxbgnwa7#
Cast<T>
将尝试将所有项强制转换为给定类型T
。此强制转换可能失败或引发异常。OfType<T>
将返回原始集合的一个子集,并且只返回T
类型的对象。