zoukankan      html  css  js  c++  java
  • 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}
  • 相关阅读:
    ftp如果有文件夹直接建文件,没有创建文件夹
    jfinal相关
    jfinal多数据源
    创建maven项目多模块项目
    多线程分批处理list内的值
    内部类_常见的用途
    获取aplicationContext对象,从而获取任何注入的对象
    jquery表单验证
    monkeyrunner录制回放
    android稳定性测试
  • 原文地址:https://www.cnblogs.com/hunji-fight/p/3215271.html
Copyright © 2011-2022 走看看