我们说我有这段代码:
func work<S: Sequence>(sequence: S) {
// do stuff
}
我如何计算sequence
中有多少元素?
我所采用的明显版本效率很低:
var count = 0
for element in sequence {
count += 1
}
必须有更好的方式,对吧?
答案 0 :(得分:7)
我认为没有更好的方法可以满足任意类型
SequenceType
。关于序列唯一知道的是
有一个generate()
方法返回GeneratorType
,反过来
有一个next()
方法。 next()
方法进入下一个方法
序列的元素并返回它,如果存在则返回nil
没有下一个元素。
请注意,next()
最终不会返回
nil
:序列可能包含“无限”元素。
因此,枚举序列是计算序列的唯一方法 元素。但这不需要终止。因此答案可以 也是:一个接受序列参数的函数不应该知道 元素总数。
对于符合CollectionType
的类型,您可以使用
countElements()
函数(在Swift 1.2中重命名为count()
)。
还有underestimateCount()
:
/// Return an underestimate of the number of elements in the given
/// sequence, without consuming the sequence. For Sequences that are
/// actually Collections, this will return countElements(x)
func underestimateCount<T : SequenceType>(x: T) -> Int
但这并不一定会返回确切的元素数。
答案 1 :(得分:2)
更“实用”的方法是:
akka 2.3.12
甚至进行扩展:
let count = sequence.reduce(0) { acc, row in acc + 1 }
注意,这仍然存在基本的序列问题,即您必须消耗序列才能对其进行计数。