C # 开发 —— 拉姆表达式

What‘s LINQ? Language Integrated Query 是也。说得再明白一些,这是编程语言的一种新特性,能够将数据查询语句集成到编程语言中。

主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据访问的复杂性。

通过GetMethods的方法,拿到string的所有方法,接下来,选出所有非静态的方法签名

MethodInfo[] methods=typeof(string).getMethods();

var result = from m in methods

where m.IsStatic!=true

select m.Name;

foreach(var r in result)

{  Console.WriteLine(r.ToString()); }

Console.ReadLine();

看起来,var 有点像javascript 里面的弱类型的变量声明。但是,C#是强类型的,尽管你用var来声明,编译器还是可以根据上下文推倒出它当前的类型。

var result =(from m in methods
    where m.IsStatic!=true
    select m.Name).Distinct();

去掉重复记录


class MyClass
{
    public string MethodName{get;set;}
    public int Overload{get;set;}
}
class Program
{
    MyClass mc=new MyClass{MethodName = "aaa",Overload=2};
}

大括号里面的叫类初始化器,省去了构造函数,在new的同时,给对象的属性赋值。

var result = from m in methods 
where m.IsStatic != true 
group m by m.Name into g 
select new { MethodName = g.Key, Overload = g.Count() };

 

new一个新对象,居然连类名都不写。没错,这就叫匿名类。



C # 3.0 的新特性

隐含类型局部变量

var age = 26;
var username = "zhuye";
var userlist = new [] {"a","b","c"};
foreach(var user in userlist)
Console.WriteLine(user);

让编译器自己推断变量类型,但是既然让编译器推断类型就必须声明的时候赋值,而且不能是null值。注意,这只能用于局部变量,用于字段是不可以的。

var data = new {username = "zhuye",age = 26}; 

Console.WriteLine("username:{0} age:{1}", data.username, data.age);

  匿名类型允许开发人员定义行内类型,无须显式定义类型。常和var配合使用,var用于声明匿名类型。

扩展方法

public static class helper
{
    public static string MD5Hash(this string s)
    {
        return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s,"MD5");
    }
    public static bool In(this object o, IEnumerable b)
    {
        foreach(object obj in b)
        {
            if(obj==o)
                return true;
        }
        return false;
    }
}
// 调用扩展方法
Console.WriteLine("123456".MD5Hash());
Console.WriteLine("1".In(new[]{"1","2","3"}));

对象初始化器

public class Person
{
public string username { get; set; }
public int age { get; set; }
public override string ToString()
{
return string.Format("username:{0} age:{1}", this.username, this.age);
}
}
Person p = new Person() {username = "zhuye", age=26};
Console.WriteLine(p.ToString());

编译器会自动为你做setter操作,使得原本几行的属性赋值操作能在一行中完成。这里需要注意:

?    允许只给一部分属性赋值,包括internal访问级别

?    可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行

 

集合初始化器

public class Person
{
public string username { get; set; }
public int age { get; set; }
public override string ToString()
{
return string.Format("username:{0} age:{1}", this.username, this.age);
}
}
var persons = new List {
new Person {username = "a", age=1},
new Person {username = "b", age=2}};
foreach(var p in persons)
Console.WriteLine(p.ToString());

 

Lambda表达式

var list = new [] { "aa", "bb", "ac" };
var result = Array.FindAll(list, s => (s.IndexOf("a") > -1));
foreach (var v in result)
Console.WriteLine(v);

语法如下:

(参数列表) => 表达式或者语句块

参数个数:可以有多个参数,一个参数,或者无参数。

  表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)

 

var persons = new List {
    new Person {username = "a", age=19},
    new Person {username = "b", age=20},
    new Person {username = "a", age=21},
};
var selectperson = from p in persons where p.age >= 20 select p.username.ToUpper();
foreach(var p in selectperson)
    Console.WriteLine(p);

上面的查询句法等价于下面的代码:

var selectperson = persons.Where(p=>p.age>=20).Select(p=>p.username.ToUpper());

之后的拉姆表达式的功能大部分集中在实体与数据库表项的操作,也就是各种DB操作,先不涉及了~~


Expression<Func<string, bool >> expr = o => o.Length > 10;

初次接触Linq Lambda表达式的人可能会被搞迷糊,这样的语句到底是什么意思,怎么样工作,原理又是什么。

逐级分析以上语句,分为两个部分,以等号为界。

第一部分是变量类型的申明:Expression<Func<string, bool>> expr,表示expr这个变量是一个Linq Lambda表达式,这个表达式符合这样的一种委托:bool DelegateName(string obj)。

第二部分是表达式的声明o => o.Length > 10,这个“=>”是Lambda操作符,读作“转到”,必须把=>左右看成是一个整体,因为这实际是一个匿名方法,“=>”左边是方法传入参数的申明,右边是函数体,如果用常规的表示方法,可以写成如下形式:

bool MethodName(string o)

   {

     return o.Length > 10;

   }

仔细观察两部分拆解以后的形式其实不难发现,第一部分的工作是定义了一个匿名的委托,而第二部分则是符合这个匿名委托的一个方法,由于这个方法没有明确给定名称,因此称为匿名方法。

C # 开发 —— 拉姆表达式,布布扣,bubuko.com

时间: 2024-10-29 19:08:34

C # 开发 —— 拉姆表达式的相关文章

【Reporting Services 报表开发】— 表达式

一.常用的SSRS原始函数可以打开文本框的表达式中看到,如图1 图1 如下为SSRS中设计报表时常用的运算函数: 运算符/函数 说明 + 前后位数字则为加法,前后为字符串则为链接符号 - 数值减法 * 乘法 / 除法,例如:100/33 = 33.333... \ 整数除法,例如:100\3 = 33 MOD 求余,例如:10 MOD 3 = 1 ^ 次方,例如:4^2 = 16 & 字符串与数字的链接符号 LEFT 向左取出特定个数的字符,例如:LEFT(Fields!ProductName,

GForms开发平台

1. 开发平台概述 1.1. 产品概述 GForms开发平台让开发人员甚至非技术人员在短短几分钟内创建全功能的展现服务,让开发团队更加适应客户和市场的需求,从而提高客户服务和速度实现收益. GForms提供展现服务可视化开发.部署.运行平台: 1.开发平台:开发平台基于开放的.深受广大开发人员喜欢的Eclipse研发,可以与svn.cvs等版本控制器结合实现版本管理.通过使用GForms设计器能够快速构建和部署全功能的Web窗体应用程序. 2.运行时:运行时包含各类GForms展现服务的转换处理

aop 的一些表达式

切入点的表达式 execution(void cn.itcast.e_xml.a_before.UserServiceImpl.saveUser(java.lang.String,java.lang.String)) * 表示:无返回类型,cn.itcast.e_xml.a_before包中的UserServiceImpl类,类中的saveUser方法,参数2个,都是String类型 表达式的写法 execution(modifiers-pattern? (非必填项)--<访问修饰符>? re

C# 表达式树分页扩展(三)

一.前言 前面我们知道了表达树的基本知识,也明白了怎么遍历和修改一个表达式,这里我们就一个实际的场景来进行功能开发. 表达式系列目录 C# 表达式树讲解(一) C# 表达式树遍历(二) 二.分页扩展 在实际的开发中,肯定会遇到这样的应用场景,一个数据源需要在页面上进行分页显示,并且页面上需要对该数据源有一个排名.本来分页可以在数据库层面完成,但是因为这里有一个排名功能,所谓的排名,就是需要查询出所有满足条件的数据,然后按照某个算法升序或者降序排列,然后按照进行排名.排名之后,然后根据分页信息,将

JSP

编写Java无脚本的Jsp页面 在jsp页面中使用EL表达式语言 在JSP页面中使用JSTL 使用JAVAbean,EL和JSTL编写无脚本的JSP页面 使用JSP EL <jsp:getProperty>的property属性只能访问Bean的属性,而不是访问嵌套的属性 使用JSP EL(即表达式语言Expreession langange) <%@page contextType="text/html;charset=gb2321"%> <html&g

Spring day02笔记

spring day01回顾 编写流程(基于xml) 1.导入jar包:4+1 --> beans/core/context/expression | commons-logging 2.编写目标类:dao和service 3.spring配置文件 IoC:<bean id="" class="" > DI:<bean> <property name="" value="" | ref=&q

2016.5.10(编写Java无脚本的JSP页面)

JSP表达式语言EL JSP页面中显示结果 jsp:useBean和jsp:getProperty两个元素冗长而笨拙 jsp:getProperty只支持对简单Bean属性的访问 使用JSP EL <jsp:getProperty>的property属性只能访问Bean的属性,而不能访问嵌套的属性 使用JSP EL(即表达式语言Expression Language) <%@ page contentType="text/html; charset=gb2312" %

工作流系统中的语法标记系统

以微软的WF为基础,为达到ERP中的批核与通知目的,参考现有系统中的技术,在此分享其中的技巧. 先来看最终的结果,也就是下图中的工作流宿主. 在上面的工作流定义中,除工作流宿主(rehost)技术外,还需要解决规则表达式的解析难题. .NET WF提供的规则编辑器是基于代码的,但对于一个无代码的开发环境,需要找到一种表达式的设计,解析规范. 比如,在运行时,我们需要根据当前的运行参数解析出以上表达式的分支,最终流向哪个批核结点. 经过摸索,我提供现有系统中已经应用的三种方案,供读者参考. 1 查

XForms设计器-----XPath编辑器

GForms平台提供XPath编辑器,辅助开发人员开发xpath表达式. 分为三个区域:选择区域.编辑器区域及问题显示区域. 其中,选择区域: 模型实例树:包含所有的模型实例数据节点,包括属性及元素,如果需要选择某个节点请双击或拖拽到编辑器区域即可. 函数树:包含所有的xforms1.0及xforms1.1所支持的所有xpath,每个函数具体使用说明请参考相关xpath手册. 操作符树:xpath所支持的操作. 配置提示: 如果需要选择模型实例自身,则请在模型实例树上选择模型实例树节点或模型实例