MST

星途 面试题库

面试题:C# 中高阶函数的应用场景

请举例说明在 C# 函数式编程中,高阶函数常见的应用场景有哪些,并简单阐述如何通过高阶函数实现代码的复用和抽象。
32.9万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

高阶函数常见应用场景

  1. 数据处理与转换
    • 场景:在处理集合数据时,经常需要对集合中的每个元素进行相同的操作,如将列表中的所有数字平方。
    • 示例:假设有一个整数列表,要将列表中的每个元素平方。可以使用 Enumerable.Select 方法,它是一个高阶函数。
    List<int> numbers = new List<int> { 1, 2, 3, 4 };
    var squaredNumbers = numbers.Select(x => x * x).ToList();
    
  2. 过滤数据
    • 场景:从集合中筛选出符合特定条件的元素。例如,从一个学生列表中筛选出成绩大于 80 分的学生。
    • 示例:假设有一个包含学生成绩的列表,筛选出成绩大于 80 的学生成绩。
    List<int> scores = new List<int> { 75, 85, 90, 70 };
    var highScores = scores.Where(score => score > 80).ToList();
    
  3. 函数组合
    • 场景:当需要一系列的操作依次作用于数据时,可以通过函数组合来实现。比如先对字符串进行小写转换,然后再去除空格。
    • 示例:假设有一个字符串,先将其转换为小写,再去除两端空格。
    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);
    

通过高阶函数实现代码复用和抽象

  1. 代码复用
    • 原理:高阶函数允许将通用的操作抽象出来,通过传递不同的具体逻辑(以函数作为参数)来应用这些通用操作。例如 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 方法的逻辑被复用,通过传递不同的转换函数来适应不同类型的集合。
  2. 抽象
    • 原理:高阶函数帮助将具体的业务逻辑从通用的控制逻辑中分离出来。例如在 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 方法,使得代码结构更清晰,也更容易维护和扩展。