我了解list实际上包含值,而sequence是IEnumerable<T>
的别名。在实际的F#开发中,我何时应该使用序列而不是列表?
以下是我可以看到序列更好的原因:
IEnumerable<T>
。 还有其他人吗?
答案 0 :(得分:82)
我认为您在何时选择Seq
的摘要非常好。以下是一些补充要点:
Seq
,因为它们适用于任何.NET集合Seq
或Seq.windowed
Seq.pairwise
我认为默认情况下选择Seq
是最佳选择,那么何时会选择不同的类型?
使用List
模式进行递归处理时使用head::tail
(实现标准库中不可用的一些功能)
当您需要一个可以逐步构建的简单不可变数据结构时,请使用List
(例如,如果您需要在一个线程上处理列表 - 显示一些统计信息 - 并在您收到更多值(即从网络服务)同时继续在另一个线程上构建列表)
使用List
处理短列表时 - 如果值通常表示空列表,则列表是最佳使用的数据结构,因为它非常有效方案
当您需要大量值类型时,请使用Array
(数组将数据存储在平坦的内存块中,因此在这种情况下它们的内存效率更高)
当您需要随机访问或更高性能(以及缓存位置)时使用Array
答案 1 :(得分:26)
在以下情况下也更喜欢seq
您不希望同时将所有元素保存在内存中。
表现并不重要。
您需要在枚举前后执行某些操作,例如:连接到数据库并关闭连接。
您没有连接(重复Seq.append
将堆叠溢出)。
在以下时间选择list
:
元素很少。
你会在前期和斩首之前。
seq
和list
都不适合并行,但这并不一定意味着它们也不好。例如,您可以使用其中一个来表示要并行完成的一小组单独的工作项。
答案 2 :(得分:11)
只有一个小点:Seq
和Array
优于List
并行。
您有几个选项:来自F#PowerPack的PSeq,Array.Parallel模块和Async.Parallel(异步计算)。由于其顺序性(head::tail
组合),列表对于并行执行非常糟糕。
答案 3 :(得分:7)
列表功能更强,数学友好。当每个元素相等时,2个列表相等。
序列不是。
let list1 = [1..3]
let list2 = [1..3]
printfn "equal lists? %b" (list1=list2)
let seq1 = seq {1..3}
let seq2 = seq {1..3}
printfn "equal seqs? %b" (seq1=seq2)
答案 4 :(得分:4)
您应该始终在公共API中公开Seq
。在内部实施中使用List
和Array
。