C#用Lambda和委托实现模板方法

 更新时间:2013年03月18日 20:21:04   作者:  
C#用Lambda和委托实现模板方法,需要的朋友可以参考一下

1 问题描述
查看下面这段代码:

复制代码 代码如下:

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]);
  }

很明显,上述代码中存在for循环的重复代码。

2 解决方案
如何消除重复?使用委托。

•定义委托

复制代码 代码如下:

delegate int mapfun(int x);//以替换上述代码中不同的部分

•模板方法

复制代码 代码如下:

//只负责遍历
void map(mapfun fn, int[] a)
{
  for (int i = 0; i < a.Length; ++i)
    {
      a[i] = fn(a[i]);
    }
}

•客户端代码

复制代码 代码如下:

int[] a = {1, 2, 3};
map(delegate(int x) { return x * 2; }, a);  //.Net 2.0支持委托匿名方法
map(x => { Console.WriteLine(x); return x; }, a); //.Net 3.0开始支持lambda表达式

3 完整代码示例

复制代码 代码如下:

class Program
{
  static void Main(string[] args)
  {
    int[] a = {1, 2, 3};
    map(delegate(int x) { return x * 2; }, a);  //.Net 2.0支持委托匿名方法
    map(x => { Console.WriteLine(x); return x; }, a); //.Net 3.0开始支持lambda表达式
  }

  delegate int mapfun(int x);
  static void map(mapfun fn, int[] a)
  {
    for (int i = 0; i < a.Length; ++i)
      {
        a[i] = fn(a[i]);
      }
  }
}

4 与传统模板方法的比较
1.减少了子类数量,模板方法中,拓展一套算法就需要一个子类。
2.模板将算法隐藏,委托交由客户代码去选择。

相关文章

  • C#带你玩扫雷(附源码)

    C#带你玩扫雷(附源码)

    这篇文章主要介绍了C#带你玩扫雷(附源码),详细的介绍实现扫雷的方法,具体一定的参考价值,有兴趣的可以了解一下
    2017-10-10
  • C#调用python.exe使用arcpy方式

    C#调用python.exe使用arcpy方式

    这篇文章主要介绍了C#调用python.exe使用arcpy方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 解读赫夫曼树编码的问题

    解读赫夫曼树编码的问题

    本篇文章对赫夫曼树编码的问题进行了分析说明,需要的朋友参考下
    2013-05-05
  • C#解决Excel边框样式无法复制及格式刷功能

    C#解决Excel边框样式无法复制及格式刷功能

    在运行数据表数据导出到 EXCEL 数据输出时遇到了一个问题,开发者设计了单行细线下边框的输出模板,但是边框的样式无法复制,所以本文给大家介绍了C#解决Excel边框样式无法复制及格式刷功能,需要的朋友可以参考下
    2024-09-09
  • C#如何给word文档添加水印

    C#如何给word文档添加水印

    这篇文章主要为大家详细介绍了C#如何给word文档添加水印的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • C#使用非托管代码直接修改字符串的方法

    C#使用非托管代码直接修改字符串的方法

    在string方法中,如ToUpper等字符串操作方法,都会产生一个新的字符串,这样增大了运行开支。一个替代方案是通过非托管代码直接操作字符串。如替代ToUpper方法:
    2013-07-07
  • C#实现FTP客户端的案例

    C#实现FTP客户端的案例

    这篇文章主要为大家详细介绍了C#实现FTP客户端的小案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C#使用伪随机数实现加密用户密码的方法

    C#使用伪随机数实现加密用户密码的方法

    这篇文章主要介绍了C#使用伪随机数实现加密用户密码的方法,对于开发C#会员系统或者程序安全问题都有一定的参考借鉴价值,需要的朋友可以参考下
    2014-07-07
  • C#判断页面中的多个文本框输入值是否有重复的实现方法

    C#判断页面中的多个文本框输入值是否有重复的实现方法

    这篇文章主要介绍了C#判断页面中的多个文本框输入值是否有重复的实现方法,是一个非常简单实用的技巧,需要的朋友可以参考下
    2014-10-10
  • C#中StringBuilder类的使用总结

    C#中StringBuilder类的使用总结

    本篇文章主要是对C#中StringBuilder类的使用方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01

最新评论