Linq学习(主要参考linq之路)----2LINQ方法语法

  方法语法:Fluent Syntax

  方法语法是非常灵活和重要的。我们这里讲描述使用连接查询运算符的方式来创建复杂的子查询,方法语法的本质是通过扩展方法Lambda表达式来创建查询。

  eg1:

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的传输链,如图:

上例中,Where产生一个经过过滤的sequence;OrderBy生成输入sequence的排序版本;Select得到的序列中的每个元素都经过了给定lambda表达式的转换。

  其中Where,OrderBy,Select这几个扩展方法的签名(其中predicate/Func/Action参考 predicate/Func/Action泛型委托 ):

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.

  元素运算符会从输入sequence中获取单个元素,如:First,Last和ElementAt;

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)运算符返回一个标量值,通常是数值类型:

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}
原文地址:https://www.cnblogs.com/hunji-fight/p/3215271.html