有没有一种快速简单的方法可以将整个字符串列表转换为浮点数或整数并将它们添加在一起,类似于 F# 中的这个?
foreach(string s in list)
{
sum += int.Parse(s);
}
如果你想以最少的字符数为目标,那么你可以将Ganesh发布的解决方案简化为这样的内容:
let sum = list |> Seq.sumBy int
这几乎做了同样的事情 - int
函数是一个通用转换,可将任何内容转换为整数(它也适用于字符串)。sumBy
函数是map
和sum
的组合,它首先将所有元素投影到一个数值,然后对结果求和。
像这样的东西应该有同样的效果:
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>
型。
从技术上讲,至少有 3 种不同的方法:
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) 与 2) 的想法相同,但使用 byref 指针类型:
let inline (+=) (x:_ byref) y = x <- x + y
let mutable sum = 0
for s in list do &sum += int s