Linq學習(主要參考linq之路)----2LINQ方法語法

  方法語法: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}
相關文章
相關標籤/搜索