从函数创建转换器的最佳方法是什么?

本文关键字:方法 是什么 最佳 函数 创建 转换器 | 更新日期: 2023-09-27 18:06:24

我想像这样应用函数对象作为转换器:

Func<int, double> f = x => x / 2.5;
Converter<int, double> convert = f;
List<double> applied_list = new List<int>(){1, 2, 3}.ConvertAll(convert);

编译器给我这样的消息:

错误CS0029不能隐式转换类型"系统"。函数"到"系统。转换器'

使用函数作为转换器的最佳方法是什么?

从函数创建转换器的最佳方法是什么?

这里有三个选项。按照我喜欢的顺序,它们是:

  • 开始使用LINQ代替ConvertAll:

    List<double> appliedList = new List { 1, 2, 3 }.Select(f).ToList();
    
  • 创建一个以:

    开头的转换器
    Converter<int, double> converter = x => x / 2.5;
    List<double> appliedList = new List { 1, 2, 3 }.ConvertAll(converter);
    
  • 如果你真的,真的必须,使用委托创建表达式从函数创建一个转换器:

    Func<int, double> f = x => x / 2.5;
    Converter<int, double> converter = new Converter<int, double>(f);
    List<double> appliedList = new List { 1, 2, 3 }.ConvertAll(converter);
    

最后一个选项创建一个代理,它只包装原来的代理。

使用var converter = new Converter<int, double>(f),或者简单地使用Select()进行映射:

var appliedList = new List<int>(){ 1, 2, 3 }.Select(f);

如果您更喜欢使用.ConvertAll而不是.Select,那么实现一个简单的解决方案,以以下方式将Func转换为委托Converter:

    Func<int, double> f = x => x / 2.5;
    Converter<int, double> convert = x => f(x);
    List<double> applied_list = new List<int>() { 1, 2, 3 }.ConvertAll(convert);