zoukankan      html  css  js  c++  java
  • Linq 表达

    Lambda 简单了解

          //Lambda 
    
                //匿名方法
                //delegate (Student s) { return s.Age > 12 && s.Age < 20; };
                //Lable 表达式 (代替了上面的)
                //s => s.Age > 12 && s.Age < 20
    
                //在Lambda Expression 中指定多个参数
                //(s, youngAge) => s.Age >= youngage;
                //指定参数类型
                //(Student s, int youngAge) => s.Age >= youngage;
    
                //没有参数的Lambda表达式
                //() => Console.WriteLine("Parameter less lambda expression")
    
                //多语句Lambda表达式
                //(s, youngAge) =>
                //{
                //    Console.WriteLine("Lambda expression with multiple statements in the body");
                //    Return s.Age >= youngAge;
                //}
    View Code

    将Lambda表达式分配给委派

    lambda表达式可以分配给Func<in T, out TResult>类型委托。Func委托中的最后一个参数类型是返回类型,其余是输入参数。而Action<int T> 类型委托,只有输入参数,不返回。

    例如:

      Func<Student, bool> isStudentTeenAger = x => x.Age > 12 && x.Age < 20;
                Student std = new Student { Age = 21 };
                bool isTeen = isStudentTeenAger(std);//false

    这个委托我们可以来用方法表示

     bool isStudentTeenAger(Student s)
            {
                return s.Age > 12 && s.Age < 20;
            }

    Action:

      Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age);
                Student std = new Student() { StudentName = "Bill", Age = 21 };
                PrintStudentDetail(std);//output: Name: Bill, Age: 21

    Linq中的Func:

      IList<Student> studentList = new List<Student>() {
                    new Student { Age=15, StudentName="sealee"  },
                    new Student { Age=21, StudentName="sealee2"  },
                };
    
                Func<Student, bool> isStudentTeenAger = s => s.Age > 12 && s.Age < 20;
                var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();

    LINQ中的表达式

    我们已经了解到lambda Expression可以分配给Func或Action类型委托来处理内存中的集合。.NET编译器在编译时将分配给Func或Action类型委托的lambda表达式转换为可执行代码。

    LINQ引入了名为Expression的新类型,它表示强类型的lambda表达式。这意味着lambda表达式也可以分配给Expression <TDelegate>类型。.NET编译器将分配给Expression <TDelegate>的lambda表达式转换为表达式树而不是可执行代码。

      //定义表达式
                //Func 方法
               // Func<Student, bool> isTeenAger = s => s.Age > 12 && s.Age < 20;
                //使用Expresson包装Func委托将上述Func类型委托转换为表达式,如下所示:
                Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
    
                //调用表达式
                Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile();
                //Invoke
                bool result = isTeenAger(new Student() { ID = 1, StudentName = "Steve", Age = 20 });

    使用:

      //IEnumerable  studentList
                IList<Student> studentList = new List<Student>() {
                    new Student { Age=15, StudentName="sealee"  },
                    new Student { Age=21, StudentName="sealee2"  },
                };
                Func<Student, bool> isStudentTeenAger = s => s.Age > 12 && s.Age < 20;
                //OutDto  是我们自己定义的返回类    实际情况一般针对我们的返回接口都会生成一个单独的Dto来返回
                Expression<Func<Student, OutDto>> outDto = 
                    s => new OutDto { AAgeDto = s.Age, StudentNameDto = s.StudentName };
                var teenStudents = studentList.Where(isStudentTeenAger).AsQueryable().Select(outDto);
                //AsQueryable  注意这里,select(Expression) 需要我们是IQueryable
                //IEnumerable 使用的是 Func
                //IQueryable  使用的是  Expression<Func
  • 相关阅读:
    如何修改ls命令列出来的目录颜色
    如何替换vi的配色方案
    grep如何结尾匹配
    机器学习模型如何转换成零依赖代码
    在ubuntu bionic下对基于qemu的arm64进行linux内核5.0.1版本的编译和运行
    分析linux内核中的slub内存管理算法
    windows下如何解决chrome浏览器左下角总提示'Downloading proxy script'的问题
    发现vi出现此错误~/.vim/bundle/YouCompleteMe/third_party/ycmd/ycm_core.so: undefined symbol: clang_getCompletionFixIt
    打开vi后提示The ycmd server SHUT DOWN (restart with :YcmRestartServer)该如何处理
    ubuntu下如何修改时区和时间
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/9730051.html
Copyright © 2011-2022 走看看