我知道有两种方法可以IEnumerable从ArraylistLinq中输出类型,并想知道在哪些情况下使用它们?
例如
IEnumerable<string> someCollection = arrayList.OfType<string>()
Run Code Online (Sandbox Code Playgroud)
要么
IEnumerable<string> someCollection = arrayList.Cast<string>()
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别,我应该在哪里应用每种情况?
Ita*_*aro 313
OfType - 仅返回可以安全地转换为x类型的元素.
Cast - 将尝试将所有元素转换为x类型.如果其中一些不属于这种类型,你会得到InvalidCastException
编辑
例如:
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
Run Code Online (Sandbox Code Playgroud)
Ash*_*Ash 105
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;
}
Run Code Online (Sandbox Code Playgroud)
使用显式强制转换可以很好地执行,但如果强制转换失败,则会导致InvalidCastException.OfType()的一个效率较低但有用的变化是OfType():
public IEnumerable<T> OfType<T>(this IEnumerable source)
{
foreach(object o in source)
if(o is T)
yield return (T) o;
}
Run Code Online (Sandbox Code Playgroud)
返回的枚举将只包含可以安全地转换为指定类型的元素.
SLa*_*aks 36
Cast<string>()如果您知道所有项目都是strings ,您应该打电话.
如果其中一些不是字符串,你会得到一个例外.
OfType<string>()如果您知道某些物品不是strings并且您不想要这些物品,则应该打电话.
如果它们中的一些不是字符串,它们将不属于新字符串IEnumerable<string>.
小智 7
应该注意的是,Cast(Of T)可以在IEnumerable与其他 LINQ 函数不同的地方使用LINQ,因此,如果您需要在非泛型集合或列表(例如 )上使用 LINQ ArrayList,则可以使用Cast(Of T)强制转换为IEnumerable(Of T)LINQ 可以工作的位置。
| 归档时间: |
|
| 查看次数: |
74990 次 |
| 最近记录: |