C# 使用LINQ扩展对foreach的类型约束
我在这里的某个地方看到过一种方法,可以将从foreach循环返回的项限制为特定类型,如果我没记错的话,可以使用IEnumerable上的LINQ扩展和lambda进行类型检查。我再也找不到了,有人能告诉我这是怎么实现的吗?你在找这个吗C# 使用LINQ扩展对foreach的类型约束,c#,.net,linq,C#,.net,Linq,我在这里的某个地方看到过一种方法,可以将从foreach循环返回的项限制为特定类型,如果我没记错的话,可以使用IEnumerable上的LINQ扩展和lambda进行类型检查。我再也找不到了,有人能告诉我这是怎么实现的吗?你在找这个吗 public static IEnumerable<TResult> OfType<TResult>( this IEnumerable source ) 类型的公共静态IEnumerable( 这是一个数不清的来源 ) 您可以通
public static IEnumerable<TResult> OfType<TResult>(
this IEnumerable source
)
类型的公共静态IEnumerable(
这是一个数不清的来源
)
您可以通过调用Where扩展方法来实现这一点,如下所示:
foreach(var x in theCollection.Where(i => i.GetType() == typeof(DesiredType))
{
// Do something to x
}
但是这是非常有用的,它被内置到.NET框架中,这就是Chris在上面指出的。IEnumerable有一个名为OfType的扩展方法,已记录在案
要使用它,您可以执行以下操作:
foreach(var x in theCollection.OfType<int>())
{
// Do something to x
}
foreach(collection.OfType()中的变量x)
{
//对x做点什么
}
我真的不明白“从foreach循环返回的项”是什么意思。@Thomas,foreach循环实际上创建了一个枚举器,而不是单个项,枚举器生成('returns')对象,但我只是为了简洁。请注意,这并不完全相同-调用GetType()然后与相等运算符相比,相等运算符在继承情况下的行为会有所不同。“is”运算符(即,其中(i=>i is DesiredType))更接近OfType。是的,没错。OfType问了一个问题“这个可以转换成那个吗?”,所以它更像是类型上的IsAssignableFrom()方法。