问题描述

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、接口相关推荐

  1. c语言程序设计实验8,c语言程序设计实验报告8_c语言实验报告格式及实验内容_c语言设计报告...

    实验名称 计算出1000以内10个最大素数之和 实验目的 1.熟练掌握if.if-else.if-else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和s ...

  2. c语言坐标正算实验报告,C语言程序设计实验报告范文

    实验名称 计算出1000以内10个素数之和 实验目的 1.熟练掌握if.if-else.if-else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和swi ...

  3. c语言程序设计实验报告2,C语言程序设计实验报告2.docx

    C语言程序设计实验报告2.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该 ...

  4. c 语言差错编码实验结果,C语言程序设计实验报告(四).doc11111111111111111.doc

    C语言程序设计实验报告(四).doc11111111111111111 C语言程序设计实验报告 姓 名吴文重学 号52系 别数学系班级2班主讲教师徐时芳指导教师徐时芳实验日期2011-11-8专业10 ...

  5. c语言选择循环实验报告,C语言程序设计实验报告选择与循环结构程序设计.doc

    C语言程序设计实验报告选择与循环结构程序设计.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的 ...

  6. c语言的简单程序设计实验报告,工程学院C语言程序设计实验报告

    <工程学院C语言程序设计实验报告>由会员分享,可在线阅读,更多相关<工程学院C语言程序设计实验报告(5页珍藏版)>请在人人文库网上搜索. 1.南京工程学院实验报告课程名称C 语 ...

  7. c语言程序设计植树,C语言程序设计实验报告——实验

    C语言程序设计实验报告--实验 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...

  8. c语言程序设计数组实验报告,(C语言程序设计实验报告数组.doc

    (C语言程序设计实验报告数组 <C语言程序设计 >课程实验报告 实验名称 学 号_ 姓 名 ___ 班 别 实验日期: 年月日 实验报告日期: 年月日 指导老师: 实验地点: 成 绩: 评 ...

  9. c语言程序设计数组实验报告,c语言程序设计实验报告(数组).doc

    c语言程序设计实验报告(数组).doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3 ...

  10. c语言指针部分上机,北科大C语言程序设计实验报告8-指针-练习题代码(2次上机课内容)--...

    北科大C语言程序设计实验报告8-指针-练习题代码(2次上机课内容)-- 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文 ...

最新文章

  1. MySQL入门,了解下、
  2. idea创建javaweb项目连接mysql【HTTP Status 500】
  3. 文末送书 | WAF 那些事
  4. 解决tar命令出现“time stamp XXX in the future”的办法
  5. 成立一年 百度搜索公司迎来首任 CTO
  6. sprd camera 帧率设置_UnityPlayerSetting-Android 打包设置介绍
  7. Java基础篇:构造函数
  8. MySQL读写分离详解(二)——MyCAT实战配置
  9. 再见虚拟机!在Win10中使用Linux版本的R和Python
  10. stringbuilder寻找字符串位置可能存在多个 java_java面试题整理(一)
  11. WinZip 15注册码
  12. VGA高速PCB布局布线设计指南
  13. 怎么解决百度快照劫持咋办咋解决 、百度快照劫持如何处理
  14. 基于DDD的微服务设计和开发实战
  15. window7_64安装STAF
  16. python turtle库画画
  17. 不存私心天地间——“老召时空”2015年贺岁篇
  18. 基于PyQt的网站后台工具
  19. android AudioRecord 音频录制 噪音消除
  20. CreateProcess函数详解(转)

热门文章

  1. 你可能不知道的switch
  2. fasttext 安装_fasttext的简单介绍
  3. namenode和datanode工作机制_Hadoop的namenode的管理机制,工作机制和datanode的工作原理...
  4. android子视图无菜单,Android 菜单详解
  5. 调用其他文件的define_C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!...
  6. 安装程序无法继续 因为你的计算机安装了更新的,xp安装不了ie提示“安装了更新的Internet Explorer版本”怎么办...
  7. mysql一次读取500条数据_mysql批量插入500条数据
  8. php setcookie使用变量,PHP setcookie() 函数
  9. 八十三、经典排序算法之堆排序
  10. 为了OFFER | 腾讯2020校招后端《解压字符串》