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

我知道两种从Linq的Arraylist中将类型转换为IEnumerable方法,并想知道在哪些情况下使用它们?

例如

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

要么

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

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


OfType - 仅返回类型x的元素。
Cast - 将尝试将所有元素转换为x类型。 如果其中一些不属于这种类型,则会得到InvalidCastException

编辑
例如:

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

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;
}

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


如果您知道所有项目都是string s,则应该调用Cast<string>()
如果其中一些不是字符串,你会得到一个异常。

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

链接地址: http://www.djcxy.com/p/73723.html

上一篇: When to use Cast() and Oftype() in Linq

下一篇: Casting: (NewType) vs. Object as NewType