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

时间:2010-10-25 15:09:15

标签: c# .net linq

我知道有两种方法可以从Linq的IEnumerableArraylist投射类型,并想知道在哪些情况下使用它们?

e.g

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

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

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

7 个答案:

答案 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类型的对象。