将字符串列表转换为F#中的浮点数/整数

7
有没有一种快速简单的方法将整个字符串列表转换为浮点数或整数,并将它们相加,类似于F#中的这种方式?
foreach(string s in list)
{
    sum += int.Parse(s);
}

除了下面的答案之外,您还可以使用LINQ在C#中使其看起来非常相似:var sum = list.Select(int.Parse).Sum() - Patryk Ćwiek
3个回答

15

如果你想追求字符数量最少,那么你可以将Ganesh发布的解决方案简化成如下形式:

let sum = list |> Seq.sumBy int

这个函数做的事情与上面的函数相似 - int 函数是一种通用的转换方法,能够将任何东西转换为整数(包括字符串)。 sumBy 函数是 mapsum 的组合,它首先将所有元素投影到一个数值上,然后对结果求和。


14

这样做应该会有同样的效果:

let sum = list |> Seq.map System.Int32.Parse |> Seq.sum

F#似乎不支持引用int上的方法,所以我不得不使用System.Int32代替。

在F#中,类型seq是.NET IEnumerable的别名,因此这段代码适用于数组、列表等。

请注意在“无点”风格中使用Parse——一个没有参数的函数可以直接用作另一个期望该类型的函数的参数。在本例中,Seq.map具有以下类型:

('a -> 'b) -> seq<'a> -> seq<'b>

由于System.Int32.Parse的类型为string -> int,因此Seq.map System.Int32.Parse的类型为seq<string> -> seq<int>


0

从技术上讲,至少有三种不同的方法:

1)在其他答案中描述的Seq.sum或sumBy方法是在F#中获取总和的规范方式:

let sum = Seq.sumBy int list

2) 出于教学目的,了解如何在 F# 中模拟 C# 行为可能是有趣的;例如,使用引用单元类型:

let inline (+=) x y = x := !x + y
let sum = ref 0
for s in list do sum += int s

3) 使用byref指针类型的相同思路:

let inline (+=) (x:_ byref) y = x <- x + y
let mutable sum = 0
for s in list do &sum += int s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接