C# 使用 Lambda 表达式和委托消除重复代码

叶初
叶初
发布时间:2026-10-14| 5人浏览过
原创

在实际开发中,处理集合或数组时往往面临大量的重复遍历逻辑。本文将展示如何利用 C# 的委托(Delegate)与 Lambda 表达式构建一个通用的模板方法,从而将固定的遍历结构与可变的业务逻辑解耦,显著减少代码冗余。

问题分析:循环遍历的代码重复

在处理数组或列表时,我们经常需要执行两类操作:一是对数据进行处理(如乘以某个系数),二是输出结果。如果每次都需要编写独立的 for 或 foreach 循环,会导致大量重复代码,降低代码的可维护性。

// 原始方式示例
int[] a = { 1, 2, 3 };

// 第一次遍历:数据处理
for (int i = 0; i < a.Length; i++)
{
    a[i] = a[i] * 2;
}

// 第二次遍历:数据输出
for (int i = 0; i < a.Length; i++)
{
    Console.WriteLine(a[i]);
}

上述代码清晰地展示了“遍历”这一动作被重复书写两次。若后续还有排序、过滤等操作,这种重复将更加繁琐。

解决方案:定义委托与模板方法

为了消除重复,我们需要将“遍历结构”与“具体操作”分离。核心思路是定义一个接受委托参数的通用方法,该方法负责执行循环,而具体要在每个元素上调用的逻辑则由调用者通过委托传入。

第 1 步:定义委托类型

首先,创建一个委托类型,用于描述要对单个元素执行的操作。根据示例,我们假设该操作接收一个整数并返回一个整数(可用于转换或映射):

delegate int mapfun(int x);

这个 mapfun 委托定义了方法的签名:输入 int,输出 int。

第 2 步:实现通用模板方法

接着,编写一个静态方法 map。该方法包含固定的循环逻辑,并在循环体内调用传入的委托 fn。这样就封装了遍历细节:

static void map(mapfun fn, int[] a)
{
    for (int i = 0; i < a.Length; ++i)
    {
        a[i] = fn(a[i]); // 执行委托指定的逻辑
    }
}

第 3 步:客户端代码调用

现在,调用方只需传入具体的操作逻辑即可。从 .NET 2.0 开始支持匿名委托,从 .NET 3.0 开始更推荐使用 Lambda 表达式,使代码更加简洁。

例如,将数组中每个元素乘以 2:

int[] a = { 1, 2, 3 };

// 使用匿名委托 (.NET 2.0+)
map(delegate(int x) { return x * 2; }, a);

// 使用 Lambda 表达式 (.NET 3.0+)
map(x => x * 2, a); // 注意:此处应返回计算结果以赋值给 a[i]

如果需要在遍历的同时打印或进行其他不修改原值的操作,可以调整逻辑或直接对委托参数执行副作用操作。示例中将每个值打印并返回原值:

map(x => { Console.WriteLine(x); return x; }, a);

完整代码示例

以下是一个完整的控制台应用程序示例,演示了从定义到调用的全过程:

using System;

class Program
{
    static void Main(string[] args)
    {
        int[] a = { 1, 2, 3 };

        // 1. 使用匿名委托进行乘法运算
        // 注意:实际应用中可能不需要立即写回,这里仅做演示
        MapArray(a, delegate(int x) { return x * 2; });

        // 2. 使用 Lambda 表达式进行输出(保持值不变)
        MapArray(a, x => { 
            Console.WriteLine($"Value: {x}"); 
            return x; 
        });

        // 打印最终结果查看变化
        foreach(var val in a) Console.Write(val + " ");
    }

    // 定义委托
    delegate int mapfun(int x);

    // 通用模板方法
    static void MapArray(int[] a, mapfun fn)
    {
        for (int i = 0; i < a.Length; ++i)
        {
            a[i] = fn(a[i]);
        }
    }
}

与传统模板方法模式的比较

这种基于委托和 Lambda 的实现方式,相较于传统的面向对象设计模式(Template Method Pattern)有以下优势:

  1. 减少类数量:传统模板方法要求为每种算法变体创建一个子类。使用委托后,无需创建额外的子类,直接在调用处定义行为,降低了系统的复杂度。
  2. 动态扩展:算法的具体实现由客户端代码灵活选择,而不是在编译期硬编码在继承树中。这更符合“组合优于继承”的设计原则。
  3. 代码简洁:Lambda 表达式使得短小的业务逻辑一目了然,提高了代码的可读性。

总结

通过引入委托机制,C# 开发者可以将通用的遍历逻辑抽取为模板方法,并利用 Lambda 表达式快速注入自定义行为。这种方法不仅消除了重复代码,还极大地提升了代码的灵活性和可测试性。以上就是C#用Lambda和委托实现模板方法的详细内容,更多关于C#高级编程技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。