我知道有两种方法可以从Linq的IEnumerable
向Arraylist
投射类型,并想知道在哪些情况下使用它们?
e.g
IEnumerable<string> someCollection = arrayList.OfType<string>()
或
IEnumerable<string> someCollection = arrayList.Cast<string>()
这两种方法有什么区别?我应该在哪里应用每种情况?
答案 0 :(得分:290)
OfType
- 仅返回可以安全地转换为x类型的元素。
Cast
- 将尝试将所有元素转换为x类型。如果其中一些不属于此类型,您将获得InvalidCastException
修改强>
例如:
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
答案 1 :(得分:99)
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;
}
返回的枚举将只包含可以安全地转换为指定类型的元素。
答案 2 :(得分:32)
如果您知道所有项目都是Cast<string>()
,则应致电string
如果其中一些不是字符串,您将获得例外。
如果您知道某些商品不是OfType<string>()
且您不想要这些商品,则应致电string
。
如果其中一些不是字符串,则它们不会出现在新的IEnumerable<string>
。
答案 3 :(得分:3)
应该注意Cast(Of T)
可以在IEnumerable
上使用,与其他LINQ函数不同,所以如果您需要在非泛型集合上使用LINQ或者列表如ArrayList
,您可以使用Cast(Of T)
转换为LINQ可以使用的IEnumerable(Of T)
。
答案 4 :(得分:2)
Cast()
将尝试强制转换集合的所有元素(如果元素的类型错误,将抛出异常),而OfType()
将只返回正确类型的元素。
答案 5 :(得分:2)
OfType
将过滤元素以仅返回指定类型的元素。
如果无法将元素强制转换为目标类型,Cast
将崩溃。
答案 6 :(得分:2)
Cast<T>
会尝试将所有项目投射到给定类型T
。此演员表可能会失败或抛出异常。 OfType<T>
将返回原始集合的子集,并仅返回T
类型的对象。