我在创建一个动态的linq查询,其中Where
运营商将根据用户的选择不同,我不熟悉框架。看起来我需要使用Func
运算符,并且在包装这个语法时遇到了一些困难。Func <>运营商在纯英文
它有什么作用?这是什么意思?有人能帮我理解它是如何使用的吗?
谢谢。
我在创建一个动态的linq查询,其中Where
运营商将根据用户的选择不同,我不熟悉框架。看起来我需要使用Func
运算符,并且在包装这个语法时遇到了一些困难。Func <>运营商在纯英文
它有什么作用?这是什么意思?有人能帮我理解它是如何使用的吗?
谢谢。
Func<>
仅仅是一个预定义的委托模式:
protected bool SomeMethod(int input)
{
return true;
}
这是相当标准的方法。您可以指定此签名像这样的委托:
public delegate bool MyMethodType(int input);
此委托只服用1点的整数,并返回一个布尔值的方法好。 FUNC <>寻求通过使通用的简化这一点:
public delegate T Func<T>();
public delegate U Func<T, U>(T input);
这是有效什么FUNC <>是,只是一个普通的委托。这样,你可以说所有这些东西:
Func<int, bool> myMethod = SomeMethod;
MyMethodType myMethod = SomeMethod;
就LINQ而言,您可能会使用速记表达式语法;编译器将会把表达式转换为委托你:
.Where(x => x.SomeProperty > 10);
这种说法是等价于:
.Where(delegate(int someProperty) { return someProperty > 10) })
这是所有的编译器的语法糖。
Func
不是一个操作符 - 它只是一个通用的委托类型。如果你看一下不同的“重载”的签名应该变得更加清晰:
Func<TResult>
Func<T, TResult>
Func<T1, T2, TResult>
第一个是一个函数,它没有参数和返回值,第二个是一个函数,它有一个参数并返回一个值,依此类推。
总而言之,它本质上是一个帮助类型,它使您能够定义函数,而无需每次都定义一个委托类型。
现在,没有这个真正帮助很大动态LINQ查询,但它是你问...
Func<T>
仅仅是一个类型名。这不是一个特殊的语法。
你需要包裹头部的东西是lambda expressions。例如,考虑一下:
myCollection.Where(item => item.Size == 10)
这意味着:取集合myCollection
中的所有项目,检查每个项目的Size
属性等于10
,并且只考虑项目针对这种情况。
还有更多这样的运算符使用lambda表达式。 MSDN上有一个非常好的introduction to LINQ queries。
Func<T>
仅仅是一个类型名。这不是一个特殊的语法。
你需要用你的头部周围什么都expression trees。例如,考虑这样的:
myCollection.Where(item => item.Size == 10)
如果myCollection
是类型IQueryable<T>
的,则编译器将它变成一个表达式树表示lambda表达式item => item.Size == 10
。如果您使用它来访问(例如)SQL数据库,则该表达式会自动转换为SQL。
可以Use Expression Trees to Build Dynamic Queries作为MSDN描述。特别是,您将使用许多static methods in the Expression
type来动态构建这样的表达式树。
只需记住Func<>
意味着 “功能”。函数基本上是一个返回结果的方法。
例如:
Func<bool>
装置 “的功能 返回一个布尔”Func<string,bool>
装置 “的功能 服用一个字符串作为唯一的输入参数 并返回一个布尔”Func<bool,string,int,string,bool>
意思是“一个函数取4个输入 参数,它们分别是 类型的bool,string,int和string ... 返回一个布尔”等等:所述<>
之间列出的类型的输入参数类型以正确的顺序,除了最后这是该函数的返回类型。
现在,就Where
而言,它需要一个Func<TSource, Boolean>
作为参数,对吧?这意味着任何采用TSource
输入参数并返回Boolean
(又名bool
)的方法在那里都可以(TSource
是由Where
过滤的集合中的每个元素的类型)。
这意味着:Where
将仅保留每TSource
的量,选择的方法将返回true
。
例如: 您想筛选名字列表以仅保留以“T”开头的名字。
string[] firstnames = new string[] { "Albert", "Terry", "Bob", Tom", "Joe" };
string[] firstnamesBeginningWithT = firstnames.Where(beginsWithT).ToArray();
与beginsWithT
是这样的方法:
bool beginsWithT(string firstname)
{
return firstname.StartWith("T");
}
快捷方式存在,这使得不需要创建这个班轮方法beginsWithT
这很可能会只使用一次:
string[] firstnamesBeginningWithT = firstnames.Where(firstname => firstname.StartWith("T")).ToArray();
这意味着“对于集合中的每个元素,我们称它为firstname
为便利,让我们看看它是否明星用T表示“。该语法调用一个“lambda表达式”,相当于一个“飞行中无名称”,但与beginsWithT
类似,您会注意到它需要一个string
作为输入并返回Boolean
。因此它是一种Func<string,bool>
,适合Where
的需求。
希望一切为你更清晰! :-) Ssithra
优秀的解释! – DeveloperDan 2016-08-04 12:56:04
它不是一个运算符,而是[委托](http://msdn.microsoft.com/en-us/library/bb549151.aspx)的一种类型。 – BoltClock 2011-05-04 22:05:18
你的问题布局非常糟糕。提供一些例子以及你的语法意思。你的意思是** lambda表达吗?** – Aliostad 2011-05-04 22:07:14