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 浮点数 ...
随机推荐
- (转载)web测试方法总结
web测试方法总结 一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号.禁止直 ...
- 非ios系统是否还有出路?
**@SoftwareTeacher** 这位老师提出的问题我很喜欢,所以单拿出一篇文章,认真的回复. PS: 因学校网很差,所以现在才来回复哈,见谅.以下为正文 ...
- Linux 系统常用命令汇总(六) 文件打包与压缩
文件打包与压缩 命令 选项 注解 示例 compress 文件名 压缩指定的文件,压缩后的格式为*.z compress install.log -d 解压被压缩的文件 .z为后缀的文件:compr ...
- 2014 Super Training #6 B Launching the Spacecraft --差分约束
原题:ZOJ 3668 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3668 典型差分约束题. 将sum[0] ~ sum ...
- java 21 - 4 字符流的文件复制操作以及简化
既然字节流可以复制文件,那么字符流当然也有. 同样的思路: 数据源: a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader目的地: b.txt -- 写出数据 -- ...
- java 13-1 数组高级二分查找
查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...
- java 11-8 在大串中查找小串的案例
1.统计大串中小串出现的次数 举例: 在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun& ...
- Android 动态加载 (一) 态加载机制 案例一
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- smarty中section遍历数组
smarty中section遍历数组
- alert,confirm和prompt
1.警告消息框alertalert 方法有一个参数,即希望对用户显示的文本字符串.该字符串不是 HTML 格式.该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说,用 ...