C# 在Linq中何时使用Cast()和Oftype()
我知道有两种方法可以从Linq中的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类型。如果其中一些不是来自此类型,您将
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正确地指出,当您确定集合只包含typeT
元素时,应该使用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;
}