方法语法:Fluent Syntaxhtml
方法语法是很是灵活和重要的。咱们这里讲描述使用链接查询运算符的方式来建立复杂的子查询,方法语法的本质是经过扩展方法和Lambda表达式来建立查询。this
eg1:spa
static void Main(string[] args) { string[] names={"Tom","Jerry","Harry"}; IEnumerable<string> query=names .Where(n=>n.Contains("a")) .OrderBy(n=>n.Length) .Select(n=>n.ToUpper()); foreach(string name in query) Console.WriteLine(name); }
当连接使用查询运算符时,一个运算符的输出sequence会成为下一个运算符输入的sequence,其结果造成了一个sequence的传输链,如图:code
上例中,Where产生一个通过过滤的sequence;OrderBy生成输入sequence的排序版本;Select获得的序列中的每一个元素都通过了给定lambda表达式的转换。htm
其中Where,OrderBy,Select这几个扩展方法的签名(其中predicate/Func/Action参考 predicate/Func/Action泛型委托 ):blog
public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source,Func<TSource,bool> predicate) public static IEnumerable<TSource> OrderBy<TSource,TKey> (this IEnumerable<TSource> source,Func<TSource,Key>keySelector) public static IEnumerable<TResult> Select<TSource,TResult> (this IEnumerable<TSource> source,Func<TSource,TResult> selector)
其余的查询运算符:排序
并非全部的查询运算符都返回一个sequence.get
元素运算符会从输入sequence中获取单个元素,如:First,Last和ElementAt;string
int[] numbers={1,2,3,4,5}; int firstNumber=numbers.First(); int lastNumber=numbers.Last(); int secondNumber=numbers.ElementAt(1); int lowestNumber=numbers.OrderBy(n=>n).First();
集合(aggregation)运算符返回一个标量值,一般是数值类型:it
int count=numbers.Count(); int min=numbers.Min();
判断运算符返回一个bool值:
bool hasTheNumberNine=numbers.Contains(9); bool hasElements=numbers.Any(); bool hasAnOddElement=numbers.any(n=>(n%2)==1);
由于这些运算符并非返回一个sequence,因此咱们不能再这些运算符以后连接其余运算符。也就是说,他们通常出如今查询的最后面。
还有的接受两个输入sequence,好比Concat把一个sequence添加到另一个seqence后面;Union与Concat相似,可是会去除相同的元素:
int[] seq1={1,2,2,3}; int[] seq2={3,4,5}; IEnumerable<int> concat=seq1.Concat(seq2); //{1,2,2,3,3,4,5} IEnumerable<int> union=seq1.Union(seq2); //{1,2,3,4,5}