2011-05-04 60 views
0

我在创建一个动态的linq查询,其中Where运营商将根据用户的选择不同,我不熟悉框架。看起来我需要使用Func运算符,并且在包装这个语法时遇到了一些困难。Func <>运营商在纯英文

它有什么作用?这是什么意思?有人能帮我理解它是如何使用的吗?

谢谢。

+3

它不是一个运算符,而是[委托](http://msdn.microsoft.com/en-us/library/bb549151.aspx)的一种类型。 – BoltClock 2011-05-04 22:05:18

+0

你的问题布局非常糟糕。提供一些例子以及你的语法意思。你的意思是** lambda表达吗?** – Aliostad 2011-05-04 22:07:14

回答

4

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) }) 

这是所有的编译器的语法糖。

1

Func不是一个操作符 - 它只是一个通用的委托类型。如果你看一下不同的“重载”的签名应该变得更加清晰:

Func<TResult> 
Func<T, TResult> 
Func<T1, T2, TResult> 

第一个是一个函数,它没有参数和返回值,第二个是一个函数,它有一个参数并返回一个值,依此类推。

总而言之,它本质上是一个帮助类型,它使您能够定义函数,而无需每次都定义一个委托类型。

现在,没有这个真正帮助很大动态LINQ查询,但它是你问...

2

Func<T>仅仅是一个类型名。这不是一个特殊的语法。

你需要包裹头部的东西是lambda expressions。例如,考虑一下:

myCollection.Where(item => item.Size == 10) 

这意味着:取集合myCollection中的所有项目,检查每个项目的Size属性等于10,并且只考虑项目针对这种情况。

还有更多这样的运算符使用lambda表达式。 MSDN上有一个非常好的introduction to LINQ queries

0

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来动态构建这样的表达式树。

2

只需记住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

+0

优秀的解释! – DeveloperDan 2016-08-04 12:56:04