个别的标准查询操作是获取 Func 委托是一个参数的原型 。  ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
这是防止你不必显式声明委托类型。 下面是 Func 委托声明:  ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
几个标准查询运算符是原型才能 Func 委托作为参数。 这防止不必显式声明委托类型。 下面是 Func 委托声明:  ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
public delegate TR Func<TR>();ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
public delegate TR Func<T0, TR>(T0 a0);ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
public delegate TR Func<T0, T1, TR>(T0 a0, T1 a1);ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
public delegate TR Func<T0, T1, T2, TR>(T0 a0, T1 a1, T2 a2);ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
public delegate TR Func<T0, T1, T2, T3, TR>(T0 a0, T1 a1, T2 a2, T3 a3);
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
在每一个声明中,TR 是指返回的数据类型。请注意返回类型参数,TR,是每个重载 Func 委托的参数类型模板的最后一个参数。其他类型参数,T0,T1,T2,T3,是输入参数传递给方法。多个声明是存在的,因为一些标准查询操作需要更多参数的委托作为参数。通过查看声明,你可以看到非标准查询操作有一个委托参数需要多于四个输入参数。 ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
让我们看一看其中一个原型 Where 的操作:ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
    public static IEnumerable<T> Where<T>(ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
        this IEnumerable<T> source,ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
        Func<T, bool> predicate);
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
Predicate 参数是 Func<T, bool> 类型。 从这里,你可以看到Predicate方法或Lambda表达式,更好的接受一个单一的T 参数,并返回一个bool。你知道返回类型是最后一个参数指定的。ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
当然,你可以使用 Func 声明,就像示例 3-6 中所示.ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
示例 3-6. 一个使用 Func 委托声明的例子ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
// Create an array of ints.ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
int[] ints = new int[] { 1,2,3,4,5,6 };ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
// Declare our delegate.ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
Func<int, bool> GreaterThanTwo = i => i > 2;ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
// Perform the query  not really. Don't forget about deferred queries!!!ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
IEnumerable<int> intsGreaterThanTwo = ints.Where(GreaterThanTwo);ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
// Display the results.ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
foreach(int i in intsGreaterThanTwo)ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
    Console.WriteLine(i);
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
运行结果如下:ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
3ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
4ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
5ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
6 ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
按字母顺序、交叉引用排列标准查询操作符  ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
表 3-1 按字母顺序显示了标准查询操作符列表。因为这些操作符将在各章中出现,基于它们是否延迟,此表将帮助您在 LINQ to Objects 剩余的各章中找到每个操作符。  ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
表 3-1 按字母顺序、交叉引用排列标准查询操作符ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª:
ÉSÌe/ö‚oÁwww.netcsharp.cn»ã.×ï|óª: