MVC基础知识 – 2.新语法
1.自动属性 Auto-Implemented Properties
7.系统内置委托 Func / Action Predicate (bool (T)) / Comparison (int (T,T))
7.3.Comparison<int (T,T)> 返回int类型
7.4.Func<T,TResult> 返回自定义TResult类型
9.标准查询运算符 Standard query operator
9.1.标准查询运算符: 定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,这些方法用来对它操作的集合进行查询筛选.
9.2.标准查询运算符 - 分页 Skip().Take()
10.LINQ查询表达式
1.自动属性
回顾传统属性概念
属性的目的:封装字段,控制 1.读写权限 及 2.字段的访问规则(如:年龄范围)。
但平时,主要是用来封装 读写权限。
回顾 语法:缺点,臃肿,代码难看!麻烦!
int id; //字段
public int Id //属性
{
get { return id; }
set { id = value; }
}
自动属性 语法:只需要定义 无实现的属性语法 即可,不需要定义字段。
public int Id { get; set; }
public int Age { get; set; }
public string Name { get; set; }
2.隐式类型 var
回顾,传统变量定义方式:
int age = 11;//传统方式
隐式类型:在初始化时,就已经根据 = 右边的 值 确定了 var变量的类型了。
var age1 =12; //age1="123"; var name = "哈哈哈"; var dog = new Dog(); age1 = 123; name = "刘德华"; dog.Id = 11;
编译时,已经 把var 转成了 相应的类型了。
注意:
1.声明的同时必须初始化,因为编译时要根据初始化值类型来推断var;
2.声明后不能修改数据类型,因为初始化时已经确定了var类型了;
3.只能作为方法局部变量使用。类的成员字段、方法的形参和返回值都不能使用!因为无法编译时确定他们的类型!
4.初始化表达式不能是匿名函数和null。
查看源码:var 已经不存在了,都被替换成了 初始化值 的 类型。

3.参数默认值 和 命名参数
参数默认值
static void TestDefault(int age = 25, string name = "TangSan")
{
Console.WriteLine(string.Format("{0}的年龄为{1}", name, age));
}
测试值
TestDefault(); //TangSan的年龄为25
TestDefault(27); //TangSan的年龄为27
TestDefault(22, "Liu"); //Liu的年龄为22
命名参数
TestDefault(name: "命名参数");//命名参数的年龄为25
/// <summary>
/// 集合初始化器
/// </summary>
static void TestInitialCollection()
{
List<Dog> list = new List<Dog>{
new Dog(){ Id=1, Name="Ruiky1", Age=11, },
new Dog(){ Id=2, Name="Ruiky2", Age=12, },
new Dog(){ Id=3, Name="Ruiky3", Age=13, },
new Dog(){ Id=4, Name="Ruiky4", Age=14, },
new Dog(){ Id=5, Name="Ruiky5", Age=15, }
}; foreach (var item in list)
{
Console.WriteLine(
string.Format("ID号:{0},名称Name:{1},年龄Age:{2}.",item.Id,item.Name,item.Age));
}
}

查看源码:可以看到,编译器帮我们实例化的集合或者数组,并创建了元素对象,设置给数组或集合。

5.匿名类 & 匿名方法
匿名类
var obj = new
{
Id = 1,
Name = "Ruiky",
Age = 2
};
在编译后会生成一个【泛型类】,包含:
a. 获取所有初始值的构造函数,顺序与属性顺序一样;
b.公有的只读属性,属性不能为null/匿名函数/指针;
c.属性的私有只读字段;
d.重写的Equals,GetHashCode,ToString()方法
用处:
a.避免过度的数据累积
b.为一种情况特别进行的数据封装
c.避免进行单调重复的编码
| 注意:匿名类的属性是只读的 –可放心传递,可用在线程间共享数据 |
匿名方法
函数式编程的最大特点之一:把方法作为参数和返回值。 DGShowMsg -> MulticastDelegate(intPtr[]) -> Delegate(object,intPtr)
匿名方法:编译后会生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给 声明的委托变量。
匿名方法可以省略参数:编译的时候 会自动为这个方法 按照 委托签名的参数 添加参数
delegate void DGTest(string str);
static void InvokeMethod(DGTest dg)
{
dg("匿名方法!");
}
测试
InvokeMethod(delegate(string str)
{
Console.WriteLine("参数:" + str );
}); //匿名方法

6.扩展方法

另外写一个类,(扩展方法)


调用TestExtensionMethod

7.系统内置委托 Func / Action Predicate (bool (T)) / Comparison (int (T,T))

7.1.Action<T>(无返回类型)
7.2.Predicate<T>(返回boolen类型)
static List<Dog> GetDogList()
{
return new List<Dog>(){
new Dog(){Age=1,Name="小白1"},
new Dog(){Age=2,Name="小黑2"},
new Dog(){Age=3,Name="小花3"}
};
}
先给List<T>定义一个扩展方法
public static void DeleteItem<T>(this List<T> list, Predicate<T> predicateWhere)
{
List<T> updateitems = new List<T>();
//遍历数据集合,根据条件找到要修改的元素 添加到元素集合中
foreach (T item in list)
{
//根据传入的条件,找到要删除的元素
if (predicateWhere(item))
{
updateitems.Add(item);
}
}
//遍历要删除的元素,在集合中删除
foreach (T updates in updateitems)
{
list.Remove(updates);
}
}
然后调用
List<Dog> list = GetDogList();
//list.ForEach(new Action<Dog>( d => { Console.WriteLine(d.Name + "," + d.Age); }));
//list.ForEach(new Action<Dog>(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); }));
//Console.WriteLine("----");
//直接传方法
list.ForEach(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); });
Console.WriteLine("----");
list.DeleteItem<Dog>(delegate(Dog d) { return d.Age > 1; });
list.ForEach(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); });

调用扩展方法 DeleteItem<T>过程

7.3.Comparison<int (T,T)> 返回int类型

static void SortByInterface()
{
List<Dog> list = GetDogList();
list.Sort(new Comparison<Dog>(
delegate(Dog x, Dog y){ return y.Age - x.Age; })
);
list.ForEach(delegate(Dog d) { Console.WriteLine(d.Name + "," + d.Age); });
}

7.4.Func<T,TResult> 返回自定义TResult类型
7.4.1 定义一个SmallDog,只有Name参数
class SmallDog
{
public string Name { get; set; }
}
7.4.2 将Dog转换成SmallDog.
static void TestFunc()
{
List<Dog> list = GetDogList();
//将Dog转换成SmallDog.
IEnumerable<SmallDog> list2 = list.Select(new Func<Dog, SmallDog>(
delegate(Dog d) { return new SmallDog() { Name = d.Name }; }
));//.ToList(); foreach (var item in list2)
{
Console.WriteLine(item.Name);
} //list2.ForEach(delegate(SmallDog d) { Console.WriteLine(d.Name); });
}

7.5 Func<T,TResult>+匿名类
/// <summary>
/// Func + 匿名类<in T,out TResult>
/// </summary>
static void TestFuncAnonyClass()
{
List<Dog> list = GetDogList();
//将Dog转换成SmallDog.
var list2 = list.Select(
delegate(Dog d) { return new { Name = d.Name, Date = DateTime.Now }; }
);
foreach (var item in list2)
{
Console.WriteLine(item.Name + "," + item.Date);
}
}

8.Lambda表达式
语句Lambda 和 表达式Lambda 的区别在于,前者在 =>右边有一个语句块(大括号),而后者只有一个表达式(没有return 和大括号)
Lambda本身无类型,所以不能赋值给 var 变量。 编译时会生成一个静态方法,然后再实例化成委托传递使用.
List<Dog> list = GetDogList();
//list.FindAll(delegate(Dog d) { return d.Id > 2; });
//1.表达式 Lambda
list.FindAll(d => d.Id > 2);// goes to
list.ForEach(d => Response.Write(d.ToString() + "<br/>")); //2.语句 Lambda
list.ForEach(d => { if (d.Id > 2) Response.Write(d.ToString() + "<br/>"); });

演化过程

9.标准查询运算符 Standard query operator
9.1.标准查询运算符: 定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,这些方法用来对它操作的集合进行查询筛选.
筛选集合Where:需要提供一个带bool返回值的“筛选器”,从而表明集合中某个元素是否应该被返回。
查询投射,返回新对象集合 IEnumerable<TSource> Select()
统计数量int Count()
多条件排序 OrderBy().ThenBy().ThenBy()
集合连接 Join()
......
重新写一个GetDogList
static List<Dog> GetDogList()
{
return new List<Dog>(){
new Dog(){ Id=1, Age=10,Name="小白1", Gender=false},
new Dog(){Id=2,Age=9,Name="小黑2", Gender=true},
new Dog(){Id=3,Age=14,Name="小花3", Gender=false},
new Dog(){Id=4,Age=3,Name="小黄4", Gender=true},
new Dog(){Id=5,Age=7,Name="小白5", Gender=true}
};
}
在Dog类添加
using System; namespace NewGrammar
{
public class Dog
{
public int Id { get; set; }
public int Age { get; set; }
public string Name { get; set; } /// <summary>
/// 性别
/// </summary>
public bool Gender { get; set; } public override string ToString()
{
return Id + "," + Name + "," + Age + "," + Gender;
} }
}
Where和Select
/// <summary>
/// 标准查询运算符 - Select 投射方法(返回一个 新的集合)
/// </summary>
static void testSQOSelect()
{
List<Dog> list = GetDogList();
List<SmallDog> small = list.Where(d => d.Gender == false)
.Select(d => new SmallDog() { Name = d.Name }).ToList(); small.ForEach(d=> Console.WriteLine(d.Name));
}

orderby
/// <summary>
/// 标准查询运算符 - OrderBy 投射方法(返回一个 新的集合)
/// </summary>
static void testSQOOrderBy()
{
List<Dog> list = GetDogList();
List<Dog> small = list.OrderBy(d => d.Age).ToList(); small.ForEach(d => Console.WriteLine(d.ToString()));
}

在GetDogList方法里添加一条数据,年龄和ID2相同
new Dog(){Id=6,Age=9,Name="小黑2", Gender=true},

/// <summary>
/// 标准查询运算符 - OrderBy 投射方法(返回一个 新的集合)
/// </summary>
static void testSQOOrderBy()
{
List<Dog> list = GetDogList();
List<Dog> small = list.OrderBy(d => d.Age).ThenBy(d=>d.Id).ToList(); small.ForEach(d => Console.WriteLine(d.ToString()));
}

9.2.标准查询运算符 - 分页
/// <summary>
/// 标准查询运算符 - 分页
/// </summary>
static void TestPage()
{
var pageOne = GetPageListByIndex(1, 2);
Console.WriteLine("第一页数据:");
pageOne.ForEach(d=>Console.WriteLine(d.ToString()));
var pageTwo = GetPageListByIndex(2, 2);
Console.WriteLine("第二页数据:");
pageTwo.ForEach(d => Console.WriteLine(d.ToString()));
var pageThree = GetPageListByIndex(3, 2);
Console.WriteLine("第三页数据:");
pageThree.ForEach(d => Console.WriteLine(d.ToString()));
} /// <summary>
/// 分页
/// </summary>
/// <param name="pageIndex">页数</param>
/// <param name="pageSize">每页行数</param>
/// <returns></returns>
static List<Dog> GetPageListByIndex(int pageIndex,int pageSize)
{
List<Dog> list = GetDogList().OrderBy(d => d.Id).ToList();
return list.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
}

10.LINQ查询表达式


MVC基础知识 – 2.新语法的更多相关文章
- MVC基础知识 – 2.新语法
1.自动属性 Auto-Implemented Properties 2.隐式类型 var 3.参数默认值 和 命名参数 4.对象初始化器 与 集合初始化器 { } 5.匿名类 & 匿名方法 ...
- 1、ASP.NET MVC入门到精通——新语法
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...
- 基础知识(C#语法、数据库SQL Server)回顾与总结
前言 已经有大概一个多月没有更新博客,可能是开始变得有点懒散了吧,有时候想写,但是又需要额外投入更多的时间去学习,感觉精力完全不够用啊,所以为了弥补这一个多月的潜水,决定写一篇,衔接9月未写博客的空缺 ...
- MVC 基础知识
一. MVC架构1.MVC模式是一种严格实现应用程序各部分隔离的架构模式.隔离:分离关注点,松耦合2.模型(Model) 代表着核心的业务逻辑和数据.模型封装了域实体的属性和行为3.视图(View) ...
- Python基础知识1-基础语法
pyenv--版本管理工具(后续再补)可参见https://www.jianshu.com/p/8aaf2525fa80 冯诺依曼体系架构 编程基础 语言分类 低级语言到高级语言 高级语言 程序Pr ...
- Spring MVC基础知识整理➣拦截器和自定义注解
概述 Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息.当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理.在 MVC中,我们常用的注解 ...
- Spring MVC基础知识整理➣环境搭建和Hello World
概述 Spring MVC属于SpringFrameWork的产品,采用Model-View-Controller进行数据交互,已经融合在Spring Web Flow里面.Spring 框架提供了构 ...
- mvc基础知识(1)
复制大佬的,侵权请联系我主动删除 1.js/css合并 在之前的crud例子中,我们引入js/css脚本的方式和平常的web开发一样 <script src="~/Scripts/jq ...
- 【Python基础知识】【语法】【入门】
一.Python概述 Python是一门面向对象的编程语言,拥有强大丰富的库,没有操作系统的限制,是一种优美.清晰的编程语言. 二.Python基础语法 1.Python标识符 标识符就是程序中定义的 ...
随机推荐
- Java考试题
1. public class GC { 2. private Object o; 3. private voiddoSomethingElse(Object obj) { o ...
- 电子商务(电销)平台中系统设置模块(SysSetting)数据库设计明细
以下是自己在电子商务系统设计中的数据库设计经验总结,而今发表出来一起分享,如有不当,欢迎跟帖讨论~ 邮件服务器 (sys_smtp_server)|-- 自动编号|-- SMTP服务器地址 (host ...
- 简述this,call,apply,bind之间的关系
一.什么是this? this是JavaScript语言的一个关键字,它是函数运行时在函数体内部自动生成的一个对象,只能在函数体内部使用.函数的不同使用场合,this的指向不同. 在ES5中,this ...
- 删除rabbitmq中持久化的队列和数据
在windows中的rabbitmq安装目录中的/sbin目录下: rabbitmqctl.bat stop_app rabbitmqctl.bat reset rabbitmqctl start_a ...
- 第5章-Vue.js交互及生命周期练习
一.学习目标 使用网络请求进行前后端交互 (重点) 理解钩子函数的作用 (难点) 掌握Vue.js过滤器的使用方法 了解Vue.js事件的深入用法 (重点) 二.仿写留言板 2.1.实现" ...
- swift4.0中http连接(据于xcode9.3 URLSession)
NSURLSession是NSURLConnection的替代者,在2013年苹果全球开发者大会上(WWDC2013)随iOS7一起发布的,是对NSURLConnection进行了重构优化后的新的网络 ...
- nginx 与 tomcat 组合搭建web服务
部分内容转自 http://www.cnblogs.com/naaoveGIS/ 1. Web服务 nginx是常用的web服务器,用于获取静态资源,类似的服务器还有apache. tomcat是基于 ...
- @PathParam 和 @QueryParam
今天调试一个上传功能,客户端手持机发送数据,在URL中附加一个参数,后台用@PathParam接收,但是报错,无法获取这个参数. url:http://192.168.1.3/web1_service ...
- c# 重载运算符(ovveride operator)踩坑记,关于null比对
场景描述: 需要比对两个版本的对应对象是否完全一致(每个属性值一致),不一致的导出报表颜色标识,以便提醒后续使用报表人员. 实现思路: 对象重载ToString方法,另实现一比对基类(为了通用)重载= ...
- 无废话JavaScript(下)
五.函数式 这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯泡还在照耀着我们. 其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实 ...