我知道有两种方法将类型从Linq的数组列表转换为IEnumerable,想知道在哪些情况下使用它们?

e.g

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

or

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

这两种方法之间的区别是什么?我应该在哪里应用每种情况?


当前回答

OfType将对元素进行筛选,只返回指定类型的元素。 如果元素不能强制转换为目标类型,则强制转换将崩溃。

其他回答

OfType -只返回可以安全转换为类型x的元素。 Cast -将尝试将所有元素转换为x类型。如果其中一些元素不是这种类型,则会得到InvalidCastException

编辑 例如:

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

Cast<T>将尝试将所有项强制转换为给定类型T。此强制转换可能失败或抛出异常。OfType<T>将返回原始集合的一个子集,并且只返回类型为T的对象。

OfType将对元素进行筛选,只返回指定类型的元素。 如果元素不能强制转换为目标类型,则强制转换将崩溃。

如果知道所有项都是字符串,则应该调用Cast<string>()。 如果其中一些不是字符串,就会出现异常。

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

值得注意的是,与其他LINQ函数不同,Cast(Of T)可以在IEnumerable上使用,所以如果有需要在非泛型集合或列表(如ArrayList)上使用LINQ的情况,您可以使用Cast(Of T)强制转换为LINQ可以工作的IEnumerable(Of T)。