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 浮点数 ...
随机推荐
- 仅IE6中链接A的href为javascript协议时不能在当前页面跳转
切页面时有时用链接A来替代按钮,这样做有几个好处 鼠标放上时默认有手状效果(不用添加cursor:pointer) 可以添加低版本IE都支持的伪类 如果点击时页面要整体刷新,即跳转,这时IE6则不尽人 ...
- 001.linux下clock()检测程序运行时间
#include <stdio.h> #include <time.h> int main() { int i; int k; clock_t start,end; //clo ...
- 迅为顶级四核开发板 Exynos4412开发板,仅售560元
业内公认最强四核 藐视一切挑战 ●四核CPU ●四核GPU ●双通道内存 ●HKMG技术 ●超级性能 ●至佳稳定 ●供货周期长 Exynos 4412处理器成功应用于三星GALAXY S3 ...
- 《互联网+:从IT到DT》:阿里公关稿,数据与案例不够全面客观,电商部分有一些生动的例子,三星
本书是阿里研究院的集体创作,当然要从阿里的视角写,因此其他的互联网巨头的信息很少涉及,对阿里不利的案例很少涉及. 关于“互联网+”,关于“互联网+”跟互联网的区别,书的开头有一点介绍.我感觉总体来说直 ...
- 【温故而知新-Javascript】为DOM元素设置样式
1. 使用样式表 可以通过document.styleSheets属性访问文档中可用的CSS样式表,它会返回一组对象集合,这些对象代表了与文档管理的各个样式表. 每个样式表 都由一个CSSStyleS ...
- 翻译《Writing Idiomatic Python》(二):函数、异常
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
- HDU 4122 Alice's mooncake shop --RMQ
题意: 一个月饼店做月饼,总营业时间m小时,只能在整点做月饼,可以做无限个,不过在不同的时间做月饼的话每个月饼的花费是不一样的,假设即为cost[i],再给n个订单,即为在某个时间要多少个月饼,时间从 ...
- 树形DP求树的重心 --SGU 134
令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...
- java 21 - 15 新IO流 NIO
1:JDK4 新IO要了解的类 Buffer(缓冲),Channer(通道) 2:JDK7 要了解的新IO类 Path:与平台无关的路径. Paths:包含了返回Path的静态方法. public ...
- 通过TTL值判断系统
我们做网络的渗透测试,开始的时候会ping一下网站判断一下网站使用的系统,默认情况下, UNIX 255 LINUX 64WIN2K/NT 128WINDOWS 32 但是 每经过一个路由器就会减1这 ...