学习《深入理解C#》—— 数据类型、排序和过滤 (第一章1.1---1.2)
引言
在开始看这本书之前看过一些技术博客,填补自己对于一些知识点的不足。无意中发现了《深入理解C#》这本书,本书主要探讨C# 2、C# 3和C# 4的细节与特性,所以做了一下阅读笔记,欢迎拍砖。
目录
- 从简单的数据类型开始
- 排序和过滤
C#1 中定义的产品类型
public class Product
{
string name;
public string Name
{
get { return name; }
}
decimal price;
public decimal Price
{
get { return price; }
}
public Product(string name, decimal price)
{
this.name = name;
this.price = price;
}
public static ArrayList GetSampleProducts()
{
ArrayList list = new ArrayList();
list.Add(new Product("硬装芙蓉王", 25m));
list.Add(new Product("精白沙", 9m));
list.Add(new Product("软白沙", 5.5m));
return list;
}
public override string ToString()
{
return string.Format("{0}:{1}", name, price);
}
}
缺点:
- ArrayList没有提供内部有关编译时的信息。我们很有可能在GetSampleProducts方法中添加一个字符串到ArrayList中,因为ArrayList的Add方法中的参数是object,而编辑器并没有任何反应。
- 代码中提供了属性的取值方法,如果添加对应的赋值方法,那么赋值方法也必须是公共的方法。
- 创建属性的代码过于复杂。
C#2 中的强类型集合
因C#1中没有泛型,Product类中的静态方法GetSampleProducts,返回的是ArrayList类型,里面添加的元素只能是Product,而在C#2中的改变就是泛型。(新的内容用红色列出)
public class Product
{
string name;
public string Name
{
get { return name; }
private set { name = value; }
}
decimal price;
public decimal Price
{
get { return price; }
private set { price = value; }
}
public Product(string name, decimal price)
{
Name = name;
20 Price = price;
}
public static List<Product> GetSampleProducts()
{
List<Product> list = new List<Product>();
list.Add(new Product("硬装芙蓉王", 25m));
list.Add(new Product("精白沙", 9m));
list.Add(new Product("软白沙", 5.5m));
return list;
}
public override string ToString()
{
return string.Format("{0}:{1}", name, price);
}
}
优点:
- 属性有了私有赋值方法,且可以在构造函数中使用这个赋值方法。
- List<Product>告知编辑器里面只能包含Product,试图将一个不同的类型添加到列表中,会造成编译时错误。并且在使用List<Product>时不需要转换结果的数据类型。
针对C#1中的存在的局限性,C#2解决了原先存在的前两个问题。
C#3 中自动实现的属性
相对C#2而言,C#3引入了自动属性和集合初始化器。Product中的属性Name和Price,可以通过自动属性简化代码,而编译器最终生成的代码是一致的。
public class Product
{
public string Name{ get; private set; }
5 public decimal Price { get; private set; }
Product() { }
public Product(string name, decimal price)
{
Name = name;
Price = price;
}
public static List<Product> GetSampleProducts()
{
return new List<Product>
17 {
18 new Product("硬装芙蓉王", 25m),
19 new Product("精白沙", 9m),
20 new Product("软白沙", 5.5m)
21 };
}
public override string ToString()
{
return string.Format("{0}:{1}", Name, Price);
}
}
优点:
- 没有多余的变量与属性相关联,因为类中没有了name和price变量,在类中使用属性名称是相同的。增强了代码的一致性。
- 创建的数据列表的方式也截然不同。
- 有一个私有的无参构造函数,用于新的基于属性的初始化。
C# 4 中的命名实参
在C#4中引入了命名实参,所谓命名实参是指命名参数调用实参顺序可以和形参不同。
public class Product
{
readonly string name;
public string Name
{
get { return name; }
}
readonly decimal price;
public decimal Price
{
get { return price; }
}
public Product(string name, decimal price)
{
this.name = name;
this.price = price;
}
public static List<Product> GetSampleProducts()
{
List<Product> list = new List<Product>();
list.Add(new Product(name: "硬装芙蓉王", price: 25m));
24 list.Add(new Product(name: "精白沙", price: 9m));
25 list.Add(new Product(name: "软白沙", price: 5.5m));
return list;
}
public override string ToString()
{
return string.Format("{0}:{1}", name, price);
}
}

按名称对产品进行排序
列表排序最简单的方式就是先将列表排好序,然后遍历并显示其中的项。在上述代码C# 1中,Product类中的静态方法GetSampleProducts,返回的是ArrayList类型,我们要求使用 ArrayList.Sort,要求提供一个IComparer实现。实现代码如下:
public class ProductNameComparer : IComparer
{
public int Compare(object x, object y)
{
Product i = (Product)x;
Product j = (Product)y;
return i.Name.CompareTo(j.Name);
}
}
static void Main(string[] args)
{
ArrayList arraylist = Product.GetSampleProducts();
arraylist.Sort(new ProductNameComparer());
foreach(Product pr in arraylist)
{
Console.WriteLine(pr.Name);
}
Console.Read();
}
缺点:
- 必须引入额外的类型来帮助排序。
- Compare 方法中的强制类型转换。
- 假如ArrayList包含一个字符串货其他类型,那么代码会出错——因为在比较时会将字符串强制转型为 Product 。
- foreach 循环会隐式将列表中的每个元素转换为 Product 类型,如果其中包含字符串或其他类型,同样会报错。
然后在C#2中引入泛型了可以帮助我们解决上述问题。
public class ProductNameComparer : IComparer<Product>
{
public int Compare(Product x, Product y)
{
return x.Name.CompareTo(y.Name);
}
}
static void Main(string[] args)
{
List<Product> arraylist = Product.GetSampleProducts();
arraylist.Sort(new ProductNameComparer());
foreach(Product pr in arraylist)
{
Console.WriteLine(pr.Name);
}
Console.Read();
}
优点:
- 开始提供的就是 Product(而不可能是其他类型),在Compare方法中不需要进行强制类型转换。
- foreach也不用隐式的类型转换。
如果我们不希望引入额外的类型来帮助排序,而是直接对列表排序。C#2使用委托来排序。代码如下:
static void Main(string[] args)
{
List<Product> arraylist = Product.GetSampleProducts();
arraylist.Sort(delegate(Product x, Product y)
5 {
6 return x.Name.CompareTo(y.Name);
7 });
foreach (Product pr in arraylist)
{
Console.WriteLine(pr.Name);
}
}
C#3 可以将匿名方法替换成Lambda表达式的方式进行排序。
static void Main(string[] args)
{
List<Product> arraylist = Product.GetSampleProducts();
arraylist.Sort((x, y) => x.Name.CompareTo(y.Name));
foreach (Product pr in arraylist)
{
Console.WriteLine(pr.Name);
}
Console.Read();
}
C#3 使用扩展方法进行排序。
static void Main(string[] args)
{
List<Product> arraylist = Product.GetSampleProducts();
foreach (Product pr in arraylist.OrderBy(p => p.Name))
{
Console.WriteLine(pr.Name);
}
Console.Read();
}

查询集合
查找集合中符合条件的所有元素,是一件很简单的事情,我们来一起来看C#1、C#2、C#之间查询集合的不同。
现要求查找价格大于20的产品信息。
C#1代码:
static void Main(string[] args)
{
ArrayList arraylist = Product.GetSampleProducts();
foreach (Product pr in arraylist)
{
if (pr.Price > )
{
Console.WriteLine(pr);
}
}
Console.Read();
}
C#2代码:
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
Predicate<Product> test = delegate(Product p) //设定查询条件
{
return p.Price > ;
};
List<Product> all = list.FindAll(test); //查询所有价格大于20的产品,并保存到all中
Action<Product> pro = Console.WriteLine; //输出产品信息
all.ForEach(pro); //循环输出产品信息
Console.Read();
}
C#2另外一个版本代码:
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
list.FindAll(delegate(Product p) //设定查询条件
5 {
6 return p.Price > 20;
7 }).ForEach(Console.WriteLine);
Console.Read();
}
C#3代码:
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
list.FindAll(p => { return p.Price > 20; }).ForEach(Console.WriteLine);
Console.Read();
}
static void Main(string[] args)
{
List<Product> list = Product.GetSampleProducts();
foreach (Product pro in list.Where(p => p.Price > 20))
{
Console.WriteLine(pro);
}
Console.Read();
}

这篇就写到这里。下篇我们将继续学习《深入理解C#》的相关知识。
学习《深入理解C#》—— 数据类型、排序和过滤 (第一章1.1---1.2)的更多相关文章
- 01.C#数据类型、排序、过滤(一章1.1-1.2)
随着看的文章及探讨越多,越发现自己实在太不定性了,看下<C#深入理解>吧,做一下读书笔记,从中发现自己的不足.闲话不说,进入正题吧. 在C#1中定下一个简单的数据类型 public cla ...
- 《深入理解bootstrap》读书笔记:第一章 入门准备
一.bootstrap框架简介 Bootstrap是最流行的前端开发框架. 什么是框架:开发过程的半成品. bootstrap具有以下重要特性: (1)完整的CSS样式插件 (2)丰富的预定义样式表 ...
- python基础知识的学习和理解
参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base python基础知识笔 ...
- Java基础系列1:深入理解Java数据类型
Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个 ...
- Contoso 大学 - 3 - 排序、过滤及分页
原文 Contoso 大学 - 3 - 排序.过滤及分页 目录 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 原文地址:http://www.asp.net/mvc/ ...
- Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索
要想使得一个搜索系统更加的完美,查询精确度和页面显示算是其中比较重要的两个方面.今天,我们就来谈谈怎么使得我们的搜索系统更加的完美. 关于分词 下载地址 配置 关于高亮 关于排序 原理 冗余字段 使用 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- 理解BSTR数据类型 神奇的BSTR
理解BSTR数据类型 神奇的BSTR - 深蓝的日志 - 网易博客 http://blog.163.com/pugood@126/blog/static/13441759320091111115264 ...
随机推荐
- iOS开发- 隐藏键盘总结
一.隐藏自身软键盘 当对于有多个UITextField控件都想通过点击"Return"来隐藏自身软键盘的情况.这时的最好办法是使用Did End on Exit事件.在点击软键盘右 ...
- Python的ipython的安装
IPython是Python 的原生交互式 shell 的增强版,可以完成许多不同寻常的任务,比如帮助实现并行化计算:主要使用它提供的交互性帮助,比如代码着色.改进了的命令行回调.制表符完成.宏功能以 ...
- XML相关转换
1.将DataTable转换成xml字符串 //将DataTable转换成xml字符串: public string ConvertDataTableToXml(DataTable dt) { Mem ...
- 简单的并发测试工具 ab.exe ab.zip可下载 -摘自网络
ab.exe是一个性能检测工具,是apache server中的一个小组件,使用简单,方便 下载地址:http://files.cnblogs.com/files/gossip/ab.zip ...
- Jquery.Treeview+Jquery UI制作Web文件预览
效果图: 前台Html: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="D ...
- BS Web窗体 动态修改WebConfig文件参数及数据库链接串
WebConfig操作帮助类 /// /// ConfigurationOperator 的摘要说明 /// public class ConfigurationOperator : IDisposa ...
- 线程相关函数(4)-pthread_mutex_lock(), pthread_mutex_unlock() 互斥锁
互斥锁实例: #include <pthread.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex ...
- shell学习笔记之控制结构(三)
1.if语句 if condition then statements esle statements fi 例: #!/bin/sh echo "Is it morning? Please ...
- 【转】python3+Django+MySQL+pymysql
使用python3和Django搭建自己的服务器的时候使用的是sqlite数据库,一切顺利. 可是等到布置生产环境的时候要换成MySQL,根据Django官网的文档也设置好了setting.DATAB ...
- java 代理模式,观察者模式
代理模式1 import <a href="http://lib.csdn.net/base/17" class='replace_word' title="Jav ...