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

C# 在Linq中何时使用Cast()和Oftype(),c#,.net,linq,C#,.net,Linq,我知道有两种方法可以从Linq中的Arraylist将类型强制转换为IEnumerable,不知道在哪种情况下使用它们 e、 g IEnumerable someCollection=arrayList.OfType() 或 IEnumerable someCollection=arrayList.Cast() 这两种方法之间的区别是什么?我应该在哪里应用每种情况?of type-只返回可以安全转换为x类型的元素。 Cast-将尝试将所有元素强制转换为x类型。如果其中一些不是来自此类型,您将

我知道有两种方法可以从Linq中的
Arraylist
将类型强制转换为
IEnumerable
,不知道在哪种情况下使用它们

e、 g

IEnumerable someCollection=arrayList.OfType()

IEnumerable someCollection=arrayList.Cast()

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

of type
-只返回可以安全转换为x类型的元素。
Cast
-将尝试将所有元素强制转换为x类型。如果其中一些不是来自此类型,您将获得
InvalidCastException

编辑
例如:

object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
object[]objs=新对象[]{“12345”,12};
objs.Cast().ToArray()//抛出InvalidCastException
objs.OfType().ToArray()//返回{“12345”}
Cast()
将尝试强制转换集合的所有元素(如果元素的类型错误,将引发异常),而
of type()
将仅返回正确类型的元素。

基本上,Cast()是这样实现的:

public IEnumerable<T> Cast<T>(this IEnumerable source)
{
  foreach(object o in source)
    yield return (T) o;
}
public IEnumerable强制转换(此IEnumerable源代码)
{
foreach(源中的对象o)
收益率(T)o;
}
使用显式强制转换执行得很好,但如果强制转换失败,将导致InvalidCastException。这个想法的一个效率较低但有用的变体是()类型:

public类型的IEnumerable(此IEnumerable源代码)
{
foreach(源中的对象o)
if(o是T)
收益率(T)o;
}

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

of type
将筛选元素以仅返回指定类型的元素。 如果无法将元素转换为目标类型,
Cast
将崩溃。

如果知道所有项都是
string
s,则应调用
Cast()

如果其中一些不是字符串,则会出现异常

如果您知道某些项不是
字符串,并且您不需要这些项,则应调用OfType()


如果其中一些不是字符串,它们将不在新的
IEnumerable

Cast
中,它将尝试将所有项强制转换为给定的类型
t
。此强制转换可能失败或引发异常<类型的代码>将返回原始集合的子集,并仅返回类型为
T
的对象。应该注意的是,
Cast(of T)
可用于
IEnumerable
与其他LINQ函数不同,因此,如果您需要在非泛型集合或列表(如
ArrayList
)上使用LINQ,您可以使用
Cast(Of T)
将其转换为
IEnumerable(Of T)
,LINQ可以在其中工作。

为此干杯。这两个元素都是预先尝试过的,但它们都具有预期的所有类型的元素,因此我看不到它们之间的差异。@SLaks正确地指出,当您确定集合只包含type
T
元素时,应该使用
Cast
<由于
is
类型检查,类型的code>较慢。如果集合的类型为
IEnumerable
Cast
将简单地将整个集合转换为
IEnumerable
,并避免枚举它<类型的code>仍将枚举。ref:即使在枚举时
.Cast()
没有抛出的情况下,它也不等同于
.OfType()
。原因是
null
值总是被
.OfType()
跳过。例如:
new System.Collections.ArrayList{“abc”,“def”,null,“ghi”,of type().Count()
只给出
3
;与
.Cast()
类似的表达式的计算结果为
4
。换句话说,它类似于“as”和“Cast”运算符之间的差异。这个答案(目前)是唯一一个明确建议何时使用哪个方法的答案。请注意,
of type()
也将跳过
null
值。e、 g:
新字符串[]{“abc”,“123”,null,“}.OfType().Count()
等于
3
,而
.Cast().Count()
等于
4
object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }
public IEnumerable<T> Cast<T>(this IEnumerable source)
{
  foreach(object o in source)
    yield return (T) o;
}
public IEnumerable<T> OfType<T>(this IEnumerable source)
{
  foreach(object o in source)
    if(o is T)
      yield return (T) o;
}