6.2.2 C# 中处理元组的方法

728 篇文章 1 订阅
349 篇文章 0 订阅

6.2.2 C# 中处理元组的方法

 

在本节,我们将继续处理第三章的泛型 Tuple 类,添加类似于刚才在 F# 中看到的功能。清单 6.6 就是高阶函数 mapFirst 和 mapSecond 的 C# 版本。

 

清单 6.6 处理元组的扩展方法 (C#)

public static class Tuple {

  publicstatic Tuple<B, C> MapFirst<A, B, C>

      (thisTuple<A, C> t, Func<A, B> f) {   [1]

    return Tuple.Create(f(t.Item1), t.Item2);

  }

  publicstatic Tuple<C, B> MapSecond<A, B, C>

     (this Tuple<C, A> t, Func<A, B> f) {

    return Tuple.Create(t.Item1, f(t.Item2));

  }

}

 

这些方法的实现非常简单,但我们必须显式指定类型;类型参数使用的名字,与前面 F# 版本一样,这是为了可以进行比较。在 C# 中,类型签名已经包含在实现之中了,会使代码难以阅读,我们可以单独看看类型签名:

 

Tuple<B, C> MapFirst(Tuple<A,C>, Func<A, B>)

 

这与前面 F# 签名相对应。可以发现,最后一个参数是函数,把A 类型的值转换成 B 类型的值,我们将在输入的元组中使用 A 类型,在结果中使用 B 类型;我们还改变了参数的顺序,因此,原始的元组现在是第一个参数。这是因为,我们想把这个方法作为元组的扩展方法来使用,所以,元组必须放在开头;我们还为第一个参数添加了 this 修饰符[1],告诉编译器,这将成为扩展方法。现在,对于这个方法,既可以直接使用,也可以作为扩展方法使用:

 

var oldPrague = Tuple.Create("Prague",1188000);

var newPrague1 = Tuple.MapSecond(oldPrague,n => n + 13195);

var newPrague2 = oldPrague.MapSecond(n=> n + 13195);

 

直接调用方法的代码,非常类似于在 F# 中的第一种用法,因为,它调用方法,使用两个参数,其中一个是 lambda 函数。在 F# 中,我们能够先写原始的元组,再使用管道运算符,而扩展方法也能发挥同样的作用,可以在最后一行看到。因为 MapSecond 写成扩展方法,可以在 oldPrague 对象上使用点表示法进行调用。

在本节,我们看到了两个处理元组的高阶函数,我敢保证,你现在就能写出其他函数,比如,对元组的两个元素应用相同的操作,等等。在前一章,我们讨论过多值时,讲到过可选值,现在,我们遵循同样的模式,看一下处理可选值的高阶函数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值