C#——《C#语言程序设计》实验报告——综合练习——委托、Lambda表达式、LINQ、接口
问题描述
1、使用委托、Lambda表达式、LINQ等知识完成以下内容:(本题35分)
(1)要求定义Employee类,带有Name属性(string类型),带有Birthday属性(DateTime类型),带有Salary属性(double类型);重载ToString()方法,将信息以适当格式输出。[8分]
(2)定义一个委托如下 :
delegate bool EmployeePredicate(Employee emp);
写一个静态方法FindEmployee,根据filter参数在数组中查找符合条件的Person实例,方法声明为:[6分]
static List<Employee> FindEmployee(Employee[] emps, EmployeePredicate t)
(3)写一个静态方法FilterBySalary,使之符合委托EmployeePredicate定义,当Salary超过7000时返回true。[3分]
(4)在主方法中添加代码,结合(2)和(3),将工资超过7000的员工找出来并打印。[3分]
(5)编写一个静态类MyExtensions,其中有一个静态方法Eighties,扩展DateTime类型的功能。如日期符合“80后”定义则返回true,否则返回false。其中年份数据可通过 DateTime的Year属性访问到。[5分]
private static bool IsEighties(DateTime dt)
(6)利用(5)中扩展方法写一个lambda表达式,调用(2)中方法,把80后员工找出来并打印。[5分]
(7)利用LINQ技术,把80后员工找出来,按工资从高到低排序,并打印。[5分]
主方法中已提供以下代码和数据:
public static void Main(string[] argv){Employee[] employees = new Employee[] {new Employee { Name = "Damon", Birthday = new DateTime(1988, 5, 1), Salary = 4000 },new Employee { Name = "Niki", Birthday = new DateTime(1995, 10, 4), Salary = 7500 },new Employee { Name= "Ayrton", Birthday = new DateTime(1982, 6, 23), Salary = 9200 },new Employee { Name= "Graham", Birthday = new DateTime(1994, 9, 15), Salary = 6800 }};}
2、Array类的静态Sort方法要求数组中的元素是可比较的。[16分]
1)扩展第1题中Employee类的功能,使之实现泛型IComparable<T>接口(其中定义了方法int CompareTo(T p)),按Salary进行比较。(第1题中已答出的代码不需要重复写。)[4分]
2)如果需要以其它方式对Employee对象进行排序,就需要自己创建一个类EmployeeComparer,实现泛型IComparer<T>接口(其中定义了方法int Compare(T a, T b)),它独立于要比较的类,因此需要两个参数进行比较。
写个一EmployeeComparer类,继承IComparer<T>,内部包含一个整型Sort属性。当Sort为0时按Salary进行比较,为1时按Name排序,为2时按DateTime排序。其中string类和DateTime类均已实现IComparable接口。[8分]
3)在主方法中实现按Salary和Name的两种排序。[4分]
解决方案
using System;
using System.Collections.Generic;
using System.Linq;namespace Homework20
{/**1、使用委托、Lambda表达式、LINQ等知识完成以下内容:(本题35分)(1)要求定义Employee类,带有Name属性(string类型),带有Birthday属性(DateTime类型),带有Salary属性(double类型);重载ToString()方法,将信息以适当格式输出。[8分](2)定义一个委托如下 :delegate bool EmployeePredicate(Employee emp);写一个静态方法FindEmployee,根据filter参数在数组中查找符合条件的Person实例,方法声明为:[6分]static List<Employee> FindEmployee(Employee[] emps, EmployeePredicate t)(3)写一个静态方法FilterBySalary,使之符合委托EmployeePredicate定义,当Salary超过7000时返回true。[3分](4)在主方法中添加代码,结合(2)和(3),将工资超过7000的员工找出来并打印。[3分](5)编写一个静态类MyExtensions,其中有一个静态方法Eighties,扩展DateTime类型的功能。如日期符合“80后”定义则返回true,否则返回false。其中年份数据可通过 DateTime的Year属性访问到。[5分]private static bool IsEighties(DateTime dt)(6)利用(5)中扩展方法写一个lambda表达式,调用(2)中方法,把80后员工找出来并打印。[5分](7)利用LINQ技术,把80后员工找出来,按工资从高到低排序,并打印。[5分]主方法中已提供以下代码和数据:public static void Main(string[] argv){Employee[] employees = new Employee[] {new Employee { Name = "Damon", Birthday = new DateTime(1988, 5, 1), Salary = 4000 },new Employee { Name = "Niki", Birthday = new DateTime(1995, 10, 4), Salary = 7500 },new Employee { Name= "Ayrton", Birthday = new DateTime(1982, 6, 23), Salary = 9200 },new Employee { Name= "Graham", Birthday = new DateTime(1994, 9, 15), Salary = 6800 }};}*//**2、Array类的静态Sort方法要求数组中的元素是可比较的。[16分]1)扩展第1题中Employee类的功能,使之实现泛型IComparable<T>接口(其中定义了方法int CompareTo(T p)),按Salary进行比较。(第1题中已答出的代码不需要重复写。)[4分]2)如果需要以其它方式对Employee对象进行排序,就需要自己创建一个类EmployeeComparer,实现泛型IComparer<T>接口(其中定义了方法int Compare(T a, T b)),它独立于要比较的类,因此需要两个参数进行比较。写个一EmployeeComparer类,继承IComparer<T>,内部包含一个整型Sort属性。当Sort为0时按Salary进行比较,为1时按Name排序,为2时按DateTime排序。其中string类和DateTime类均已实现IComparable接口。[8分]3)在主方法中实现按Salary和Name的两种排序。[4分]*/class Employee : IComparable<Employee>{public string Name;public DateTime Birthday;public double Salary;public override string ToString(){return string.Format("{0}: Salary={1}, Birthday={2}", Name, Salary, Birthday);}public int CompareTo(Employee emp){return (int)(Salary - emp.Salary);}}public static class MyExtensions{public static bool IsEighties(this DateTime d){return d.Year > 1979 && d.Year < 1990;}}class EmployeeComparer : IComparer<Employee>{public int Sort { get; set; }public EmployeeComparer(int sort){Sort = sort;}public int Compare(Employee e1, Employee e2){switch (Sort){case 0:return (int)(e1.Salary - e1.Salary);case 1:return e1.Name.CompareTo(e2.Name);default:return e1.Birthday.CompareTo(e2.Birthday);}}}class Program{delegate bool EmployeePredicate(Employee emp);static List<Employee> FindEmployee(Employee[] emps, EmployeePredicate t) {List<Employee> results = new List<Employee>();foreach (Employee p in emps){if (t(p))results.Add(p);}return results;}private static bool FilterBySalary(Employee emp) {return emp.Salary > 7000;}public static void Main(string[] args){Employee[] employees = new Employee[] {new Employee { Name = "Damon", Birthday = new DateTime(1988, 5, 1), Salary = 4000 },new Employee { Name = "Niki", Birthday = new DateTime(1995, 10, 4), Salary = 7500 },new Employee { Name= "Ayrton", Birthday = new DateTime(1982, 6, 23), Salary = 9200 },new Employee { Name= "Graham", Birthday = new DateTime(1994, 9, 15), Salary = 6800 }};List<Employee> high = FindEmployee(employees, FilterBySalary);foreach (Employee emp in high)Console.WriteLine(emp);List<Employee> eighties = FindEmployee(employees, p => p.Birthday.IsEighties());foreach (Employee emp in eighties)Console.WriteLine(emp);var eighties2 = from emp in employeeswhere emp.Birthday.IsEighties() == trueorderby emp.Salary descendingselect emp;foreach (Employee emp in eighties2)Console.WriteLine(emp);Array.Sort(employees);foreach (Employee emp in employees)Console.WriteLine(emp);Array.Sort(employees,new EmployeeComparer(1));foreach (Employee emp in employees)Console.WriteLine(emp);Console.WriteLine("Hello World!");}}
}
参考答案
//1、
//(1)class Employee{public string Name { get; set; }public DateTime Birthday { get; set; }public double Salary { get; set; }public override string ToString(){return string.Format("{0}: Salary={1}, Birthday={2}", Name, Salary, Birthday);}}
//(2)private static List<Employee> FindEmployee(Employee[] ps, EmployeePredicate t){List<Employee> results = new List<Employee>();foreach (Employee p in ps){if (t(p))results.Add(p);}return results;}
//(3)private static bool FilterBySalary(Employee emp){return emp.Salary >= 7000;}
//(4)List<Employee> high = FindEmployee(employees, FilterBySalary);foreach(Employee emp in high)Console.WriteLine(emp);
//(5)public static class MyExtensions{public static bool IsEighties(this DateTime d){return d.Year > 1979 && d.Year < 1980;}}
//(6)List<Employee> eighties = FindEmployee(employees, p => p.Birthday.IsEighties());foreach(Employee emp in eighties)Console.WriteLine(emp);
//(7)var eighties2 = from emp in employeeswhere emp.Birthday.IsEighties() == trueorderby emp.Salary descendingselect emp;foreach (Employee emp in eighties2)Console.WriteLine(emp);
//2、class Employee : IComparable<Employee>{public string Name { get; set; }public DateTime Birthday { get; set; }public double Salary { get; set; }public override string ToString(){return string.Format("{0}: Salary={1}, Birthday={2}", Name, Salary, Birthday);}public int CompareTo(Employee emp){return (int)(Salary - emp.Salary);}}class EmployeeComparer : IComparer<Employee>{public int Sort { get; set; }public EmployeeComparer(int sort){Sort = sort;}public int Compare(Employee e1, Employee e2){switch(Sort){case 0:return (int)(e1.Salary - e1.Salary);case 1:return e1.Name.CompareTo(e2.Name);default:return e1.Birthday.CompareTo(e2.Birthday);}}}
运行结果
参考文章
https://www.cnblogs.com/skm-blog/p/4229487.html
https://www.cnblogs.com/forever-Ys/p/10315830.html
C#——《C#语言程序设计》实验报告——综合练习——委托、Lambda表达式、LINQ、接口相关推荐
- c语言程序设计实验8,c语言程序设计实验报告8_c语言实验报告格式及实验内容_c语言设计报告...
实验名称 计算出1000以内10个最大素数之和 实验目的 1.熟练掌握if.if-else.if-else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和s ...
- c语言坐标正算实验报告,C语言程序设计实验报告范文
实验名称 计算出1000以内10个素数之和 实验目的 1.熟练掌握if.if-else.if-else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和swi ...
- c语言程序设计实验报告2,C语言程序设计实验报告2.docx
C语言程序设计实验报告2.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该 ...
- c 语言差错编码实验结果,C语言程序设计实验报告(四).doc11111111111111111.doc
C语言程序设计实验报告(四).doc11111111111111111 C语言程序设计实验报告 姓 名吴文重学 号52系 别数学系班级2班主讲教师徐时芳指导教师徐时芳实验日期2011-11-8专业10 ...
- c语言选择循环实验报告,C语言程序设计实验报告选择与循环结构程序设计.doc
C语言程序设计实验报告选择与循环结构程序设计.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的 ...
- c语言的简单程序设计实验报告,工程学院C语言程序设计实验报告
<工程学院C语言程序设计实验报告>由会员分享,可在线阅读,更多相关<工程学院C语言程序设计实验报告(5页珍藏版)>请在人人文库网上搜索. 1.南京工程学院实验报告课程名称C 语 ...
- c语言程序设计植树,C语言程序设计实验报告——实验
C语言程序设计实验报告--实验 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...
- c语言程序设计数组实验报告,(C语言程序设计实验报告数组.doc
(C语言程序设计实验报告数组 <C语言程序设计 >课程实验报告 实验名称 学 号_ 姓 名 ___ 班 别 实验日期: 年月日 实验报告日期: 年月日 指导老师: 实验地点: 成 绩: 评 ...
- c语言程序设计数组实验报告,c语言程序设计实验报告(数组).doc
c语言程序设计实验报告(数组).doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3 ...
- c语言指针部分上机,北科大C语言程序设计实验报告8-指针-练习题代码(2次上机课内容)--...
北科大C语言程序设计实验报告8-指针-练习题代码(2次上机课内容)-- 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文 ...
最新文章
- MySQL入门,了解下、
- idea创建javaweb项目连接mysql【HTTP Status 500】
- 文末送书 | WAF 那些事
- 解决tar命令出现“time stamp XXX in the future”的办法
- 成立一年 百度搜索公司迎来首任 CTO
- sprd camera 帧率设置_UnityPlayerSetting-Android 打包设置介绍
- Java基础篇:构造函数
- MySQL读写分离详解(二)——MyCAT实战配置
- 再见虚拟机!在Win10中使用Linux版本的R和Python
- stringbuilder寻找字符串位置可能存在多个 java_java面试题整理(一)
- WinZip 15注册码
- VGA高速PCB布局布线设计指南
- 怎么解决百度快照劫持咋办咋解决 、百度快照劫持如何处理
- 基于DDD的微服务设计和开发实战
- window7_64安装STAF
- python turtle库画画
- 不存私心天地间——“老召时空”2015年贺岁篇
- 基于PyQt的网站后台工具
- android AudioRecord 音频录制 噪音消除
- CreateProcess函数详解(转)
热门文章
- 你可能不知道的switch
- fasttext 安装_fasttext的简单介绍
- namenode和datanode工作机制_Hadoop的namenode的管理机制,工作机制和datanode的工作原理...
- android子视图无菜单,Android 菜单详解
- 调用其他文件的define_C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!...
- 安装程序无法继续 因为你的计算机安装了更新的,xp安装不了ie提示“安装了更新的Internet Explorer版本”怎么办...
- mysql一次读取500条数据_mysql批量插入500条数据
- php setcookie使用变量,PHP setcookie() 函数
- 八十三、经典排序算法之堆排序
- 为了OFFER | 腾讯2020校招后端《解压字符串》