Xin*_*Xin 2 c# f# tuples c#-to-f#
如何编写一个等于下面的c#代码的F#方法?试图谷歌它,但找不到任何工作.谢谢.
public List<Tuple<long, string, string>> Fun(List<Tuple<long, string>> param)
{
var ret = new List<Tuple<long, string, string>>();
foreach (var tuple in param)
{
ret.Add(new Tuple<long, string, string>(tuple.Item1, tuple.Item2, "new val"));
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用惯用的功能列表,那么你可以写:
let func (param:(int64 * string) list) =
[ for n, s in param -> n, s, "new val" ]
Run Code Online (Sandbox Code Playgroud)
我添加了注释(int64 * string) list,以确保您获得与C#中相同的类型.如果你没有添加它,那么F#编译器会推断该函数是通用的 - 因为它实际上与元组的前两个元素的类型无关.注释也可以用C#样式表示法编写,使用param:list<int64 * string>它可能更容易阅读.
如果你想使用.NET List类型(在F#中通常不推荐使用),你可以使用F#别名ResizeArray并写:
let func (param:(int64 * string) ResizeArray) =
ResizeArray [ for n, s in param -> n, s, "new val" ]
Run Code Online (Sandbox Code Playgroud)
这将创建一个F#列表,然后将其转换为.NET List<T>类型.这应该为您提供与C#版本完全相同的公共IL签名,但我建议使用F#特定类型.
作为旁注,第二个示例可以使用命令式F#代码实现(使用for迭代元素就像在C#中一样).这会产生与C#完全相同的IL,但如果您稍后需要优化某些F#代码,这将非常有用.所以我不推荐这个版本(它也更长:-)):
let func (param:(int64 * string) ResizeArray) =
let res = new ResizeArray<_>()
for n, s in param do
res.Add(n, s, "new val")
res
Run Code Online (Sandbox Code Playgroud)
你也可以使用高阶函数,如List.map:
let func (param:(int64 * string) list) =
params |> List.map (fun (n, s) -> n, s, "new val")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1326 次 |
| 最近记录: |