如何在linq中的lambda表达式中捕获局部变量的类型
How to capture type of a local variable inside a lambda expression in linq
我今天发现了一些重复的代码,想将其缩减为一种方法。为了做到这一点,我想在这里向 lambda 中注入一些更抽象的东西:
public IEnumerable<AbstractFoo> GetMatchingFoos()
{
return IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => d is RedFoo);
}
//Horrifying duplicate code!:
public IEnumerable<AbstractFoo> GetMatchingFoos()
{
return IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => d is BlueFoo);
}
我希望能够将 RedFoo
/ BlueFoo
替换为我可以像这样注入到单个方法中的东西:
public IEnumerable<AbstractFoo> GetMatchingFoos(paramFoo)
{
IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => d is paramFoo.GetType()); //compile error
}
我 tried using curly braces 访问局部变量 paramFoo,但无法编译。
IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => is {paramFoo.GetType();}); //compile error
另请注意:AbstractFoo
是一个抽象 class,RedFoo
和 BlueFoo
都继承自该抽象。此时我的代码中没有接口。
如何在 linq 的 lambda 表达式中捕获局部变量的类型?
使用 Enumerable.OfType 查找所需类型的所有元素。
The OfType(IEnumerable) method returns only those elements in source that can be cast to type TResult. To instead receive an exception if an element cannot be cast to type TResult, use Cast(IEnumerable).
public IEnumerable<AbstractFoo> GetMatchingFoos<T>() where T : AbstractFoo
{
return exactMatchList.OfType<T>();
}
有一个 LINQ 扩展方法可以按类型查找 OfType<T>
。
请参阅我刚才制作的以下代码片段(另外,you can run it here):
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public class A {}
public class B : A {}
public class C {}
public static void Main()
{
IEnumerable<A> result = new object [] { new A(), new B(), new C() }.OfType<A>();
// Result: 2, because there're two instance of type A!
Console.WriteLine(result.Count());
}
}
我今天发现了一些重复的代码,想将其缩减为一种方法。为了做到这一点,我想在这里向 lambda 中注入一些更抽象的东西:
public IEnumerable<AbstractFoo> GetMatchingFoos()
{
return IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => d is RedFoo);
}
//Horrifying duplicate code!:
public IEnumerable<AbstractFoo> GetMatchingFoos()
{
return IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => d is BlueFoo);
}
我希望能够将 RedFoo
/ BlueFoo
替换为我可以像这样注入到单个方法中的东西:
public IEnumerable<AbstractFoo> GetMatchingFoos(paramFoo)
{
IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => d is paramFoo.GetType()); //compile error
}
我 tried using curly braces 访问局部变量 paramFoo,但无法编译。
IEnumerable<AbstractFoo> exactMatchFoo = exactMatchList
.Where (d => is {paramFoo.GetType();}); //compile error
另请注意:AbstractFoo
是一个抽象 class,RedFoo
和 BlueFoo
都继承自该抽象。此时我的代码中没有接口。
如何在 linq 的 lambda 表达式中捕获局部变量的类型?
使用 Enumerable.OfType 查找所需类型的所有元素。
The OfType(IEnumerable) method returns only those elements in source that can be cast to type TResult. To instead receive an exception if an element cannot be cast to type TResult, use Cast(IEnumerable).
public IEnumerable<AbstractFoo> GetMatchingFoos<T>() where T : AbstractFoo
{
return exactMatchList.OfType<T>();
}
有一个 LINQ 扩展方法可以按类型查找 OfType<T>
。
请参阅我刚才制作的以下代码片段(另外,you can run it here):
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public class A {}
public class B : A {}
public class C {}
public static void Main()
{
IEnumerable<A> result = new object [] { new A(), new B(), new C() }.OfType<A>();
// Result: 2, because there're two instance of type A!
Console.WriteLine(result.Count());
}
}