首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时在Linq中使用Cast()和Oftype()

何时在Linq中使用Cast()和Oftype()
EN

Stack Overflow用户
提问于 2010-10-25 23:09:15
回答 6查看 90.8K关注 0票数 239

我知道有两种方法可以将类型从Linq中的Arraylist转换为IEnumerable,我想知道在什么情况下应该使用它们?

e.g

代码语言:javascript
复制
IEnumerable<string> someCollection = arrayList.OfType<string>()

代码语言:javascript
复制
IEnumerable<string> someCollection = arrayList.Cast<string>()

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

EN

回答 6

Stack Overflow用户

发布于 2010-10-25 23:13:59

来源:LINQ Tip: Enumerable.OfType - Solutionizing .NET

从根本上说,Cast<T>()是这样实现的:

代码语言:javascript
复制
public IEnumerable<T> Cast<T>(this IEnumerable source)
{
  foreach(object o in source)
    yield return (T) o;
}

使用显式强制转换执行得很好,但如果强制转换失败,将导致InvalidCastException。这个想法的另一个不太有效但有用的变体是OfType<T>()

代码语言:javascript
复制
public IEnumerable<T> OfType<T>(this IEnumerable source)
{
  foreach(object o in source)
    if(o is T)
      yield return (T) o;
}

返回的枚举将只包含可以安全地转换为指定类型的元素。

票数 123
EN

Stack Overflow用户

发布于 2010-10-25 23:14:35

如果您知道所有项都是strings,则应该调用Cast<string>()

如果它们中的一些不是字符串,您将得到一个异常。

如果您知道某些项不是strings,并且不需要这些项,则应该调用OfType<string>()

如果其中一些不是字符串,那么它们就不会出现在新的IEnumerable<string>中。

票数 45
EN

Stack Overflow用户

发布于 2014-07-30 17:21:01

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4015930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档