5

是否有一个简洁的符号来访问数组的最后一个元素,类似于 C++ 中的 std::vector::back() ?我必须写:

veryLongArrayName.[veryLongArrayName.Length-1]

每一次?

4

3 回答 3

10

从评论扩展

内置选项是Seq.last veryLongArrayName,但请注意,这是 O(N) 而不是 O(1),因此对于除最小数组之外的所有数组,实际使用可能效率太低。

也就是说,自己抽象这个功能并没有什么坏处:

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
[<RequireQualifiedAccess>]
module Array =
    let inline last (arr:_[]) = arr.[arr.Length - 1]

现在你可以在Array.last veryLongArrayName没有任何开销的情况下做,同时保持代码非常惯用和可读。

于 2013-03-01T18:31:49.573 回答
8

我在官方文档中找不到,但 F# 4 似乎已经Array.last实现了开箱即用:

/// Returns the last element of the array.
/// array: The input array.
val inline last : array:'T [] -> 'T

链接到 github 上的实现

于 2016-05-20T22:50:58.230 回答
6

作为为 _[] 编写函数的替代方法,您还可以为 IList<'T> 编写扩展属性:

open System.Collections.Generic

[<AutoOpen>]
module IListExtensions =
    type IList<'T> with 
        member self.Last = self.[self.Count - 1]

let lastValue = [|1; 5; 13|].Last // 13
于 2013-03-04T14:48:41.897 回答