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 浮点数 ...
随机推荐
- ACM竞赛高手比其他程序员水平高很多吗?
1. ACM是一种很直接的评价程序员水平的体系 2. ACM竞赛会带来很多机遇(深造or工作),同时又是一个不小的挑战 3. 为竞赛而竞赛的事情不可取 详细点击这里
- 23 其它话题 - 《Python 核心编程》
- BI测试工具之跨数据库数据对比,支持oracle,sqlserver
应用场景: 本周在进行SIT,我帮助仅有的一个测试妹妹对部分表进行数据质量验证,第一步需要做的就是比对source与stage表的table definition 与 数据内容的一致性. 本项目使用的 ...
- [编]IoT The Internet of Things (IoT) 物联网
物联网是新一代信息技术的重要组成部分.其英文名称是“The Internet of things”.由此,顾名思义,“物联网就是物物相连的互联网”.这有两层意思:第一,物联网的核心和基础仍然是互联网, ...
- CentOS 6.5部署安装Memcached
1. Yum安装Memcache 查找memcached yum search memcached 该命令可以查询yum库中有关memcached的安装包信息,以下是搜寻结果截图: 安装 memc ...
- perl学习笔记
一.正则表达式 匹配一个文件中的某个单词,并打印出来 #!/usr/bin/perl use strict; use warnings; ; open(FILE, "< temp.pl ...
- 【温故而知新-Javascript】窗口效果 (全屏显示窗口、定时关闭窗口)
1.全屏显示窗口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- ref out 方法参数
ref out 相似 ref和out两个关键字的作用大致相同,但是有一些微妙但是重要的区别. 两者的行为相似到连编译器都认为这两者不能被重载:public void SampleMethod(out ...
- MYSQL密码设置
当MYSQL安装成功后,root用户的密码默认是空的,有三种方式可以重新设置root账号的密码 1.用root 进入mysql后 mysql>set password =password('你的 ...
- 键盘事件keydown、keypress、keyup随笔整理总结(摘抄)
原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html 原文2:http://www.cnblogs.com/leo ...