第一章 C#开发进化史:1.2排序和过滤
来源:互联网 发布:社交网络迅雷下载 编辑:程序博客网 时间:2024/06/06 01:05
1.2.1按名称对产品进行排序
//使用IComparer对ArrayList进行排序(C#1)class ProductNameComparer : IComparer{ public int Compare(object x, object y) { Product first = (Product)x; Product second = (Product)y; return first.Name.CompareTo(second.Name); }}...ArrayList products = Product.GetSampleProducts();products.Sort(new ProductNameComparer());foreach(Product product in products){ Console.WriteLine(product);}
1.必须引入额外的类型来帮助排序(实现IComparer)
2.强制转换带来的问题——如果ArrayList中包含一个字符串,强制将string转为Product就会报错
代码知识点:
1.Product如果实现的是IComparable,就只能定义一种排序顺序
2.这里foreach循环会隐式将列表中每个元素转换为Product类型
//使用ICompare对List 进行排序(C#2)class ProductNameComparer : IComparer { public int Compare(Product x, Product y) { return x.Name.CompareTo(y.Name); }}...List products=product.GetSampleProducts();products.Sort(new ProductNameComparer());foreach(Product product in products){ Console.WriteLine(product);}
C#2中引入了泛型,避免了类型转换。
但是上面的代码还是需要实现接口来对产品进行排序,依靠委托可以解决这个问题。
//使用Comparison对List 进行排序(C#2)List products=Product.GetSampleProducts();products.Sort(delegate(Product x,Product y) { return x.Name.Compare(y.Name); });foreach(Product product in products){ Console.WriteLine(product);}
C#2同时引入了匿名方法,使代码更简洁
//在Lambda表达式中使用Comparision进行排序(C#3)List products=Product.GetSampeProducts();products.Sort((x,y) => x.Name.CompareTo(y.Name));foreach(Product product in products){ Console.WriteLine(product);}
C#3中引入了Lambda表达式,使委托的表达更加简洁优雅
//使用一个扩展方法对List进行排序(C#3)List products=Product.GetSampleProducts();foreach(Product product in products.OrderBy(p=>p.Name)){ Console.WriteLine(product);}
C#3中引入扩展方法,使得在不修改原始产品列表的前提下顺序打印产品名称
小结:C#1:弱类型比较功能、不支持委托排序—>C#2:强类型的比较功能、委托方法、匿名方法—>C#3:表达式、扩展方法、允许列表保持未排序状态
1.2.2查询集合
//循环、测试和打印(C#1)Listproducts=Product.GetSampleProducts();foreach(Product product in products){ if (product.Price > 10m) { Console.WriteLine(product); }}
//测试和打印分开进行(C#2)Listproducts = Product.GetSampleProducts();//Predicate表示定义一组条件并确定指定对象是否符合这些条件的方法Predicate test = delegate(Product P) { return P.Price > 10m; };List matches = products.FindAll(test);//Action封装一个方法,这里使用了C#2方法组转换的特性Action print = Console.WriteLine;matches.ForEach(print);
//测试和打印分开的另一个版本(C#2)Listproducts=Product.GetSampleProducts();products.FindAll(delegate(Product P) { return P.Price>10; }).ForEach(Console.WriteLine);
C#2:测试和打印任务分离
//用Lambda表达式来测试 Listproducts = Product.GetSampleProducts();foreach(Product product in products.Where(p => p.Price > 10)){ Console.WriteLine(product);}
小结:C#1:条件和操作紧密耦合,两者都是硬编码的—>C#2:条件和操作分开,匿名方法使委托变得简单—>C#3:Lambda表达式使条件变得更容易阅读
0 0
- 第一章 C#开发进化史:1.2排序和过滤
- 第一章 C#开发进化史:1.3处理未知数据
- 1.C#开发进化史
- 第一章 C#开发的进化史:1.1从简单的数据类型开始
- 【第一章】C#的进化史——C#1.0,2.0,3.0区别比较(二)——C#2.0,3.0 简化排序的特性
- C#进化史
- 【第一章】C#的进化史——C#1.0,2.0,3.0区别比较(一)
- C#开发的进化史(从简单的数据类型开始)
- 【第一章】C#的进化史——表示产品的未知价格
- C#进化史-属性
- WHERE&过滤和排序
- Oracle_过滤和排序
- 过滤和排序
- 过滤和排序
- 过滤和排序
- 过滤和排序
- 【02】 - 过滤和排序
- oracle--过滤和排序
- SPSSModeler中数据测量类型的含义…
- 一遍记住Java常用的八种排序算法与代码实现
- 禁止页面滚动的详细解决方法介绍
- 设计模式-命令模式
- vbe中库文件相关操作(疑难杂症)
- 第一章 C#开发进化史:1.2排序和过滤
- WORD动态目录打印预览出现:错误未…
- openshift新增本地仓库
- 废止的法律
- 全面解析非全日制用工的风险…
- 一文读懂商业智能(BI):企业数据分析的中枢
- 关于非全日制用工若干问题的…
- CustomerApp的技术缺陷
- 法定退休年龄