方法語法: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}