面试题答案
一键面试高阶函数常见应用场景
- 数据处理与转换
- 场景:在处理集合数据时,经常需要对集合中的每个元素进行相同的操作,如将列表中的所有数字平方。
- 示例:假设有一个整数列表,要将列表中的每个元素平方。可以使用
Enumerable.Select
方法,它是一个高阶函数。
List<int> numbers = new List<int> { 1, 2, 3, 4 }; var squaredNumbers = numbers.Select(x => x * x).ToList();
- 过滤数据
- 场景:从集合中筛选出符合特定条件的元素。例如,从一个学生列表中筛选出成绩大于 80 分的学生。
- 示例:假设有一个包含学生成绩的列表,筛选出成绩大于 80 的学生成绩。
List<int> scores = new List<int> { 75, 85, 90, 70 }; var highScores = scores.Where(score => score > 80).ToList();
- 函数组合
- 场景:当需要一系列的操作依次作用于数据时,可以通过函数组合来实现。比如先对字符串进行小写转换,然后再去除空格。
- 示例:假设有一个字符串,先将其转换为小写,再去除两端空格。
Func<string, string> toLower = s => s.ToLower(); Func<string, string> trim = s => s.Trim(); Func<string, string> combined = s => trim(toLower(s)); string input = " HELLO "; string result = combined(input);
通过高阶函数实现代码复用和抽象
- 代码复用
- 原理:高阶函数允许将通用的操作抽象出来,通过传递不同的具体逻辑(以函数作为参数)来应用这些通用操作。例如
Select
方法,无论对何种类型的集合,只要传递相应的转换逻辑函数,就可以实现对集合元素的转换,避免了为每种类型集合和每种转换逻辑都编写重复代码。 - 示例:假设有两个不同类型的列表,一个是
List<int>
,一个是List<string>
,都需要进行某种转换。
这里List<int> intList = new List<int> { 1, 2, 3 }; var doubledInts = intList.Select(x => x * 2).ToList(); List<string> stringList = new List<string> { "a", "bb", "ccc" }; var lengths = stringList.Select(s => s.Length).ToList();
Select
方法的逻辑被复用,通过传递不同的转换函数来适应不同类型的集合。 - 原理:高阶函数允许将通用的操作抽象出来,通过传递不同的具体逻辑(以函数作为参数)来应用这些通用操作。例如
- 抽象
- 原理:高阶函数帮助将具体的业务逻辑从通用的控制逻辑中分离出来。例如在
Where
方法中,通用的控制逻辑是遍历集合,而具体的筛选条件作为函数参数传递进来。这样,开发者只需要关注具体的筛选条件逻辑,而无需关心遍历等底层操作,实现了更高层次的抽象。 - 示例:假设有一个复杂的筛选条件,要从一个包含员工信息的列表中筛选出年龄大于 30 且工资大于 5000 的员工。
这里将复杂的筛选条件抽象为一个函数传递给class Employee { public int Age { get; set; } public int Salary { get; set; } } List<Employee> employees = new List<Employee> { new Employee { Age = 25, Salary = 4000 }, new Employee { Age = 35, Salary = 6000 }, new Employee { Age = 28, Salary = 4500 } }; var filteredEmployees = employees.Where(emp => emp.Age > 30 && emp.Salary > 5000).ToList();
Where
方法,使得代码结构更清晰,也更容易维护和扩展。 - 原理:高阶函数帮助将具体的业务逻辑从通用的控制逻辑中分离出来。例如在