随着看的文章及探讨越多,越发现自己实在太不定性了,看下《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)的更多相关文章

  1. asp.net core 排序过滤分页组件:sieve(1)

    使用asp.net core开发时避免不了要用一个合适的分页组件来让前端获取分页数据.github上面有一个开源的分页组件在这方面很适合我的使用,于是我把他的文档翻译一下,随后会分析它里面的源码.这是 ...

  2. 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB

    走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...

  3. 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件

    [源码下载] 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件 作者:webabcd 介绍背水一战 Windows 10 之 ...

  4. DRF框架(八)——drf-jwt手动签发与校验、搜索过滤组件、排序过滤组件、基础分页组件

    自定义drf-jwt手动签发和校验 签发token源码入口 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口,不然进不了登录页面 获取提交的username ...

  5. Django(67)drf搜索过滤和排序过滤

    前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤. 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进行升序排列,就可以 ...

  6. 学习《深入理解C#》—— 数据类型、排序和过滤 (第一章1.1---1.2)

    引言 在开始看这本书之前看过一些技术博客,填补自己对于一些知识点的不足.无意中发现了<深入理解C#>这本书,本书主要探讨C# 2.C# 3和C# 4的细节与特性,所以做了一下阅读笔记,欢迎 ...

  7. 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: ...

  8. MSSQLServer基础01(数据类型)

    数据库设计:范式 现阶段,必须遵守满足3NF 1范式:列的原子性,即列不可再拆分 2范式:表中不能描述多个信息,不能有数据冗余 3范式:引用其它表的主键信息 数据类型的意义: 1>提高效率.(减 ...

  9. 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 浮点数 ...

随机推荐

  1. C++ new(1)

    如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数.在这里,和 sizeof 类似,new 和 delete 也不是函数, ...

  2. redis 非集群的主从配置及切换

    单纯的master-slave不能称之为集群,只能叫做读写分离.此案例只针对master为单点服务,且程序端写死master为可写,slave为只读.若master宕机则不可用,若主从未开启持久化,不 ...

  3. 从Wep page到Application

    需要做一个选择,是Web app还是Native app,当然,还有第三种,Hybrid app. 现在手机用户越来越多,电脑终端浏览器也在不断的更新换代,推陈出新,网页已经不仅仅是用来分享信息这么简 ...

  4. [编]IoT The Internet of Things (IoT) 物联网

    物联网是新一代信息技术的重要组成部分.其英文名称是“The Internet of things”.由此,顾名思义,“物联网就是物物相连的互联网”.这有两层意思:第一,物联网的核心和基础仍然是互联网, ...

  5. CORDIC原理与FPGA实现(2)

    CORDIC算法实现极坐标(polar)到直角坐标系(Cartesian)的变换. 1: function [horizonal,vertical]=polar2car(mag, pha); 2: x ...

  6. uva 122 trees on the level——yhx

    题目如下:Given a sequence of binary trees, you are to write a program that prints a level-order traversa ...

  7. 【Android UI设计与开发】6.底部菜单栏(三)使用Fragment+PopupWindow仿QQ空间最新版底部菜单栏

    直接看栗子吧,效果基本实现,界面微调和弹窗的优化,去做的话会很耗时说,暂时就酱紫了.上传效果动态图太大了,直接手机截图的效果图如下: 至于代码的实现主要就是自定义的菜单栏,和用 PopupWindow ...

  8. codeforces 442C C. Artem and Array(贪心)

    题目链接: C. Artem and Array time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  9. page-cache层以及各种标志位之间的转换

    对真实文件系统层,算是懂了,但是vfs层以及block层还是有点生疏呢,最近要好好分析一下了. page-cache层主要关注文件读写时的行为,包括页的状态之间的变化,何时变脏,何时变成writeba ...

  10. C语言 结构体中的成员域偏移量

    //C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...