我知道有两种方法可以将类型从Linq中的Arraylist
转换为IEnumerable
,我想知道在什么情况下应该使用它们?
e.g
IEnumerable<string> someCollection = arrayList.OfType<string>()
或
IEnumerable<string> someCollection = arrayList.Cast<string>()
这两种方法之间的区别是什么,我应该在哪里应用每种情况?
发布于 2010-10-25 23:13:59
来源:LINQ Tip: Enumerable.OfType - Solutionizing .NET
从根本上说,Cast<T>()
是这样实现的:
public IEnumerable<T> Cast<T>(this IEnumerable source)
{
foreach(object o in source)
yield return (T) o;
}
使用显式强制转换执行得很好,但如果强制转换失败,将导致InvalidCastException
。这个想法的另一个不太有效但有用的变体是OfType<T>()
。
public IEnumerable<T> OfType<T>(this IEnumerable source)
{
foreach(object o in source)
if(o is T)
yield return (T) o;
}
返回的枚举将只包含可以安全地转换为指定类型的元素。
发布于 2010-10-25 23:14:35
如果您知道所有项都是string
s,则应该调用Cast<string>()
。
如果它们中的一些不是字符串,您将得到一个异常。
如果您知道某些项不是string
s,并且不需要这些项,则应该调用OfType<string>()
。
如果其中一些不是字符串,那么它们就不会出现在新的IEnumerable<string>
中。
发布于 2014-07-30 17:21:01
应该注意的是,与其他LINQ函数不同,Cast(Of T)
可以在IEnumerable
上使用,所以如果您需要在非泛型集合或列表(如ArrayList
)上使用LINQ,您可以使用Cast(Of T)
将其转换为LINQ可以工作的IEnumerable(Of T)
。
https://stackoverflow.com/questions/4015930
复制相似问题