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}
相关文章
相关标签/搜索