01.C#数据类型、排序、过滤(一章1.1-1.2)
随着看的文章及探讨越多,越发现自己实在太不定性了,看下《C#深入理解》吧,做一下读书笔记,从中发现自己的不足。闲话不说,进入正题吧。
在C#1中定下一个简单的数据类型
public class Product1
{
private string name;
private long price; public string Name { get { return name; } }
public long Price { get { return price; } } public Product1(string n, long p)
{
this.name = n;
this.price = p;
} public static ArrayList GetProducts()
{
ArrayList list = new ArrayList();
list.Add(new Product1("cat", ));
list.Add(new Product1("fish", ));
list.Add(new Product1("dog", ));
list.Add(new Product1("pig", ));
return list;
}
}
C#1中没有泛型的概念,在Product1类中的静态方法返回是的ArrayList类型,里面的元素类型当然是Product1。而在C#2中引入泛型后,该类可定义为(重命名为Product2)
public class Product2
{
private string name;
private long price; public string Name { get { return name; } private set { name = value; } }
public long Price { get { return price; } private set { price = value; } } public Product2(string n, long p)
{
Name = n;
Price = p;
} public static List<Product2> GetProducts()
{
List<Product2> list = new List<Product2>();
list.Add(new Product2("cat", ));
list.Add(new Product2("fish", ));
list.Add(new Product2("dog", ));
list.Add(new Product2("pig", ));
return list;
}
}
相比较于C#3,对于属性的改进,则是引入自动实现属性的概念,Product1和Product2中私有属性name和price,可以通过自动属性进行书写,如下
class Product3
{
public string Name { get; private set; }
public long Price { get; private set; } public Product3(string n, long p)
{
Name = n;
Price = p;
} public static List<Product3> GetProducts()
{
List<Product3> list = new List<Product3> {
new Product3("cat",),
new Product3("fish",),
new Product3("dog",),
new Product3("pig",)
};
return list;
}
}
C#4中对类的实现主要体现在类的实例化中,引入命名实参,注意下面GetProducts方法中类对象的实例化
class Product4
{
readonly string name;
readonly long price;
public string Name { get { return name; } }
public long Price { get { return price; } } public Product4(string n, long p)
{
name = n;
price = p;
} public static List<Product4> GetProducts()
{
return new List<Product4>
{
new Product4(n:"cat",p:),
new Product4(n:"fish",p:),
new Product4(n:"dog",p:),
new Product4(n:"pig",p:)
};
}
}
如new Product4(n:"cat",p:1),格式如[参数:参数值],在实例化中可以显示的指定参数的值。
接下来说下C#进化过程中对排序方法的实现
在C#1中,需要定义一个实现于IComparer接口的类
//使用IComparer对ArrayList进行排序
public class ComparerName1 : IComparer
{
public int Compare(object x, object y)
{
Product1 p1 = (Product1)x;
Product1 p2 = (Product1)y;
return p1.Name.CompareTo(p2.Name);
}
}
在功能页面要对上述类实例化
class Program
{
static void Main(string[] args)
{
ArrayList list = Product1.GetProducts(); list.Sort(new ComparerName1()); foreach (Product1 p in list)
{
Console.WriteLine(p.Name);
}
Console.ReadKey(); }
}
可以看出ArrayList类型有一个公开的接口(用于排序Sort),传入的参数是实现IComparer接口的一个实例,正好我们上面定义的ComparerName1(根据产品的名字来排序),那么在C#2中又是如何实现?
正如前面所说C#2引入泛型的概念(对应的产品类为Product2类),定义一个实现IComparer<Product2>接口的类即可
public class ComparerName2 : IComparer<Product2>
{
public int Compare(Product2 x, Product2 y)
{
return x.Name.CompareTo(y.Name);
}
}
在功能页面使用方法和C#1一样,主要区别在于ComparerName1中需要将Object类型强制转换成Product1类型,而在使用泛型的情况下,因为已经知道了具体的类型,则避免了强制转换带来的性能损耗
。
C#3中的自动属性对于排序没有作用,但是可以使用引入的Lambda表达式对排序代码的进一步精简。
class Program
{
static void Main(string[] args)
{
//在C#3中使用Lambda表达式进行排序
List<Product3> list = Product3.GetProducts(); list.Sort(
(x, y) => x.Name.CompareTo(y.Name)
); foreach (Product3 p in list)
{
Console.WriteLine(p.Name);
}
Console.ReadKey();
}
}
Lambda表达式的实现其实是委托,用于委托实现也是一样的。
下面来说下对于查询、打印的实现。
C#1
class Program
{
static void Main(string[] args)
{
ArrayList list = Product1.GetProducts();
/*
C#1使用查询、测试、打印
*/
foreach (Product1 p in list)
{
if (p.Price > )
{
Console.WriteLine(p.Name);
}
}
Console.ReadKey(); }
}
C#2中的查询实现可以使用委托
class Program
{
static void Main(string[] args)
{
List<Product2> list = Product2.GetProducts(); //C#2使用匿名方法创建委托 Predicate<Product2> test = delegate (Product2 p) { return p.Price > ; };
List<Product2> matches = list.FindAll(test);
Action<Product2> print = delegate (Product2 p) { Console.WriteLine(p.Name); }; ;
matches.ForEach(print);
list.FindAll(test).ForEach(print); Console.ReadKey(); }
}
结果和C#1中是一样的,打印价格大于2产品的名称,到了C#3则更精简了,因为有了Lambda表达式
class Program
{
static void Main(string[] args)
{
List<Product3> list = Product3.GetProducts(); //C#3中使用Lambda表达式进行查询
list.FindAll(x => x.Price > ).ForEach(x => Console.WriteLine(x.Name)); Console.ReadKey(); }
}
写到这里,我们有理由相信,Lambda表达式就是变相的委托,则可以引入一个想法,在使用委托的时候均可以使用Lambda表达式替代。great!!!
请斧正。
01.C#数据类型、排序、过滤(一章1.1-1.2)的更多相关文章
- asp.net core 排序过滤分页组件:sieve(1)
使用asp.net core开发时避免不了要用一个合适的分页组件来让前端获取分页数据.github上面有一个开源的分页组件在这方面很适合我的使用,于是我把他的文档翻译一下,随后会分析它里面的源码.这是 ...
- 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB
走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...
- 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件
[源码下载] 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件 作者:webabcd 介绍背水一战 Windows 10 之 ...
- DRF框架(八)——drf-jwt手动签发与校验、搜索过滤组件、排序过滤组件、基础分页组件
自定义drf-jwt手动签发和校验 签发token源码入口 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口,不然进不了登录页面 获取提交的username ...
- Django(67)drf搜索过滤和排序过滤
前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤. 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进行升序排列,就可以 ...
- 学习《深入理解C#》—— 数据类型、排序和过滤 (第一章1.1---1.2)
引言 在开始看这本书之前看过一些技术博客,填补自己对于一些知识点的不足.无意中发现了<深入理解C#>这本书,本书主要探讨C# 2.C# 3和C# 4的细节与特性,所以做了一下阅读笔记,欢迎 ...
- 01 C语言程序设计--01 C语言基础--第3章 基本数据类型01
01.1.3.1序言 00:02:17 01.1.3.2 C语言中的基本元素和常量的概念 00:08:54 01.1.3.3示例--常量 00:12:08 01.1.3.4变量的概念和命名规则 00: ...
- MSSQLServer基础01(数据类型)
数据库设计:范式 现阶段,必须遵守满足3NF 1范式:列的原子性,即列不可再拆分 2范式:表中不能描述多个信息,不能有数据冗余 3范式:引用其它表的主键信息 数据类型的意义: 1>提高效率.(减 ...
- python 自动化之路 day 01.1 数据类型
一.变量二.数据类型2.1 什么是数据类型及数据类型分类2.2 标准数据类型:2.2.1 数字2.2.1.1 整型:2.2.1.2 长整型long:2.2.1.3 布尔bool:2.2.1.4 浮点数 ...
随机推荐
- Tip和菜单的实现方式
Tip和菜单有类似的功能,即鼠标光标移上去的时候显示指定元素,鼠标光标离开的时候隐藏该元素.如下 示例1:下拉菜单(鼠标移动到“客户服务”上时出现,离开则隐藏) 示例2:水平菜单(鼠标移动到“餐饮美食 ...
- loop指令
loop系列的指令有:loop,loope/loopz,loopne/loopnz,它们都是借助于ECX寄存器作为计数来实现循环,每轮循环先ecx自动减1,再来判断ecx值,ecx的自减不会影响OF和 ...
- Varchar2 size how to decide?
When you execute a complicate store procedure, maybe it will execute a long time, maybe you want to ...
- Oracle中关于bitmap index的使用问题
您如果熟悉 Oracle 数据库,我想您对 Thomas Kyte 的大名一定不会陌生. Tomas 主持的 asktom.oracle.com 网站享誉 Oracle 界数十年,绝非幸致.最近在图书 ...
- zookeeper适用场景:zookeeper解决了哪些问题
问题导读:1.master挂机,传统做法备份必然是以前数据,该如何保证挂机数据与备份数据一致?2.分布式系统如何实现对同一资源的访问,保证数据的强一致性?3.集群中的worker挂了,传统做法是什么? ...
- UVA-10652 (凸包)
题意: 给n个矩形,问包含这些矩形的尽量小的凸多边形的面积是多少; 思路: 由于给的矩形的形式是给出了中心的坐标,长和宽以及旋转的角度,所以先转换成四个点的坐标,然后求一遍凸包就好了,第一次写凸包,代 ...
- linux之间进程通信
进程间通信方式: 同主机进程间数据交换机制: pipe(无名管道) / fifo(有名管道)/ message queue(消息队列)和共享内存. 必备基础: f ...
- 第16章 Windows线程栈
16.1 线程栈及工作原理 (1)线程栈简介 ①系统在创建线程时,会为线程预订一块地址空间(即每个线程私有的栈空间),并调拨一些物理存储器.默认情况下,预订1MB的地址空间并调拨两个页面的存储器. ② ...
- Unity脚本生命周期
前言 说到生命周期,影响最深刻的是,在接触Java的JSF组件时,JSF组件的五大生命周期,全要默写出来,嘿嘿…… 总结这两天在写小怪和掉落的糖葫芦时,老是遇到GameObject未销毁,一直存在场景 ...
- JSON对象和字符串之间的相互转换
比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象: var a={"name":"tom","sex":"男&quo ...