01.C#数据类型、排序、过滤(一章1.1-1.2)

  随着看的文章及探讨越多,越发现自己实在太不定性了,看下《C#深入理解》吧,做一下读书笔记,从中发现自己的不足。闲话不说,进入正题吧。

  在C#1中定下一个简单的数据类型

 1 public class Product1
 2     {
 3         private string name;
 4         private long price;
 5
 6         public string Name { get { return name; } }
 7         public long Price { get { return price; } }
 8
 9         public Product1(string n, long p)
10         {
11             this.name = n;
12             this.price = p;
13         }
14
15         public static ArrayList GetProducts()
16         {
17             ArrayList list = new ArrayList();
18             list.Add(new Product1("cat", 1));
19             list.Add(new Product1("fish", 2));
20             list.Add(new Product1("dog", 3));
21             list.Add(new Product1("pig", 4));
22             return list;
23         }
24     }

  C#1中没有泛型的概念,在Product1类中的静态方法返回是的ArrayList类型,里面的元素类型当然是Product1。而在C#2中引入泛型后,该类可定义为(重命名为Product2)

 1 public class Product2
 2     {
 3         private string name;
 4         private long price;
 5
 6         public string Name { get { return name; } private set { name = value; } }
 7         public long Price { get { return price; } private set { price = value; } }
 8
 9         public Product2(string n, long p)
10         {
11             Name = n;
12             Price = p;
13         }
14
15         public static List<Product2> GetProducts()
16         {
17             List<Product2> list = new List<Product2>();
18             list.Add(new Product2("cat", 1));
19             list.Add(new Product2("fish", 2));
20             list.Add(new Product2("dog", 3));
21             list.Add(new Product2("pig", 4));
22             return list;
23         }
24     }

  相比较于C#3,对于属性的改进,则是引入自动实现属性的概念,Product1和Product2中私有属性name和price,可以通过自动属性进行书写,如下

 1 class Product3
 2     {
 3         public string Name { get; private set; }
 4         public long Price { get; private set; }
 5
 6         public Product3(string n, long p)
 7         {
 8             Name = n;
 9             Price = p;
10         }
11
12         public static List<Product3> GetProducts()
13         {
14             List<Product3> list = new List<Product3> {
15                 new Product3("cat",1),
16                 new Product3("fish",2),
17                 new Product3("dog",3),
18                 new Product3("pig",4)
19             };
20             return list;
21         }
22     }

  C#4中对类的实现主要体现在类的实例化中,引入命名实参,注意下面GetProducts方法中类对象的实例化

 1 class Product4
 2     {
 3         readonly string name;
 4         readonly long price;
 5         public string Name { get { return name; } }
 6         public long Price { get { return price; } }
 7
 8         public Product4(string n, long p)
 9         {
10             name = n;
11             price = p;
12         }
13
14         public static List<Product4> GetProducts()
15         {
16             return new List<Product4>
17             {
18                 new Product4(n:"cat",p:1),
19                 new Product4(n:"fish",p:2),
20                 new Product4(n:"dog",p:3),
21                 new Product4(n:"pig",p:4)
22             };
23         }
24     }

  如new Product4(n:"cat",p:1),格式如[参数:参数值],在实例化中可以显示的指定参数的值。

  接下来说下C#进化过程中对排序方法的实现

  在C#1中,需要定义一个实现于IComparer接口的类

 1 //使用IComparer对ArrayList进行排序
 2     public class ComparerName1 : IComparer
 3     {
 4         public int Compare(object x, object y)
 5         {
 6             Product1 p1 = (Product1)x;
 7             Product1 p2 = (Product1)y;
 8             return p1.Name.CompareTo(p2.Name);
 9         }
10     }

  在功能页面要对上述类实例化

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ArrayList list = Product1.GetProducts();
 6
 7             list.Sort(new ComparerName1());
 8
 9             foreach (Product1 p in list)
10             {
11                 Console.WriteLine(p.Name);
12             }
13             Console.ReadKey();
14
15         }
16     }

  可以看出ArrayList类型有一个公开的接口(用于排序Sort),传入的参数是实现IComparer接口的一个实例,正好我们上面定义的ComparerName1(根据产品的名字来排序),那么在C#2中又是如何实现?

正如前面所说C#2引入泛型的概念(对应的产品类为Product2类),定义一个实现IComparer<Product2>接口的类即可

1 public class ComparerName2 : IComparer<Product2>
2     {
3         public int Compare(Product2 x, Product2 y)
4         {
5             return x.Name.CompareTo(y.Name);
6         }
7     }

  在功能页面使用方法和C#1一样,主要区别在于ComparerName1中需要将Object类型强制转换成Product1类型,而在使用泛型的情况下,因为已经知道了具体的类型,则避免了强制转换带来的性能损耗

  C#3中的自动属性对于排序没有作用,但是可以使用引入的Lambda表达式对排序代码的进一步精简。

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //在C#3中使用Lambda表达式进行排序
 6             List<Product3> list = Product3.GetProducts();
 7
 8             list.Sort(
 9                 (x, y) => x.Name.CompareTo(y.Name)
10             );
11
12             foreach (Product3 p in list)
13             {
14                 Console.WriteLine(p.Name);
15             }
16             Console.ReadKey();
17         }
18     }

  Lambda表达式的实现其实是委托,用于委托实现也是一样的。

  下面来说下对于查询、打印的实现。

C#1

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ArrayList list = Product1.GetProducts();
 6             /*
 7                 C#1使用查询、测试、打印
 8             */
 9             foreach (Product1 p in list)
10             {
11                 if (p.Price > 2)
12                 {
13                     Console.WriteLine(p.Name);
14                 }
15             }
16             Console.ReadKey();
17
18         }
19     }

  C#2中的查询实现可以使用委托

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             List<Product2> list = Product2.GetProducts();
 6
 7             //C#2使用匿名方法创建委托
 8
 9             Predicate<Product2> test = delegate (Product2 p) { return p.Price > 2; };
10             List<Product2> matches = list.FindAll(test);
11             Action<Product2> print = delegate (Product2 p) { Console.WriteLine(p.Name); }; ;
12             matches.ForEach(print);
13             list.FindAll(test).ForEach(print);
14
15             Console.ReadKey();
16
17         }
18     }

  结果和C#1中是一样的,打印价格大于2产品的名称,到了C#3则更精简了,因为有了Lambda表达式

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             List<Product3> list = Product3.GetProducts();
 6
 7             //C#3中使用Lambda表达式进行查询
 8             list.FindAll(x => x.Price > 2).ForEach(x => Console.WriteLine(x.Name));
 9
10             Console.ReadKey();
11
12         }
13     }

  写到这里,我们有理由相信,Lambda表达式就是变相的委托,则可以引入一个想法,在使用委托的时候均可以使用Lambda表达式替代。great!!!

  请斧正。

时间: 2024-10-02 20:53:06

01.C#数据类型、排序、过滤(一章1.1-1.2)的相关文章

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

使用asp.net core开发时避免不了要用一个合适的分页组件来让前端获取分页数据.github上面有一个开源的分页组件在这方面很适合我的使用,于是我把他的文档翻译一下,随后会分析它里面的源码.这是第一篇,介绍它如何使用. Sieve Sieves是一个.net core下面的简单.干净并且可扩展的框架,它对外暴露了排序,过滤和分页的功能. ASP.NET Core下的使用方式 在本例中,考虑一个带有Post实体的应用程序.在获取所有可用的帖子时,我们将使用Sieve添加排序.过滤和分页功能.

签发token、校验token、多方式登录签发token的实现、自定义认证反爬规则的认证类、admin使用自定义User表:新增用户密码密文、群查接口各种筛选组件数据准备、drf搜索过滤组件、drf排序过滤组件、drf基础分页组件

签发token 源码入口 # 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口 # 1)rest_framework_jwt.views.ObtainJSONWebToken 的 父类 JSONWebTokenAPIView 的 post 方法 # 接收有username.password的post请求 # 2)post方法将请求得到的数据交给 rest_framework_jwt.serializer.JSONWebTokenSerializer 处

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:09:11 01.1.3.5变量的声明.初始化和定义 00:12:18 01.1.3.6数据类型的概念和分类 00:06:22 原文地址:https://www.cnblogs.com/HiJackykun/p/10686317.html

10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 基数排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载  链接? 数据

内部排序-第10章-《数据结构题集》习题解析-严蔚敏吴伟民版

//**留坑待填**// 一.基础知识题 10.1?以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)直接插入排序:                            (2)希尔排序(增量d[1]=5): (3)快速排序:                                  (4)堆排序: (5)归并排序:                              

10-12-顺序表地址排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 顺序表地址排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链

10-9-堆排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 堆排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链接? 数

10-10-归并排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 归并排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链接?

10-8-简单选择排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 简单选择排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链接