我知道列表实际上包含值,而序列是的别名IEnumerable<T>
。在实际的F#开发中,什么时候应该使用序列而不是列表?
这是一些可以使序列更好的原因:
- 与需要.NET的其他.NET语言或库进行交互时
IEnumerable<T>
。 - 需要表示一个无限的序列(在实践中可能并不真正有用)。
- 需要懒惰的评估。
还有其他吗?
seq
生成的那种方式都会产生不同的随机数。显然,这可能是不确定性错误的来源...
Answers:
我认为您的何时选择摘要Seq
很好。以下是一些其他要点:
Seq
默认情况下,在编写函数时使用,因为这样它们就可以与任何.NET集合一起使用Seq
,如果你需要一个像高级的功能Seq.windowed
或Seq.pairwise
我认为Seq
默认情况下选择是最好的选择,那么我什么时候会选择其他类型?
使用List
时,你需要使用递归的处理head::tail
模式
(实现一些功能,不提供标准库)
使用List
时,你需要一个简单的不可变的数据结构,你可以建立一步一步的
(例如,如果你需要处理一个线程列表-显示一些统计数据-并同时继续在另一个线程构建列表,您会收到更多的价值,例如来自网络服务)
在使用List
简短列表时使用-如果值通常表示一个空列表,则list是最好的数据结构,因为在这种情况下它非常有效
Array
在需要大量值类型集合时使用
(数组将数据存储在平面内存块中,因此在这种情况下它们可以提高内存效率)
使用Array
时,你需要随机存取或更高的性能(和缓存局部性)
List
在需要简单的不可变数据结构时可以使用它,您可以逐步构建并同时在另一个线程上继续构建列表[...]”。意思是这里/如何运作?谢谢。
x::xs
而不会破坏可能正在进行迭代的任何现有工作人员xs
在以下情况下也更喜欢seq
:
您不想同时将所有元素保存在内存中。
性能并不重要。
您需要在枚举之前和之后执行某些操作,例如,连接到数据库并关闭连接。
您没有串联(重复Seq.append
将导致堆栈溢出)。
list
在以下情况下更喜欢:
元素很少。
您会做很多假装和斩首。
无论是seq
也不list
是并行好的,但,这并不一定意味着他们是坏的。例如,您可以使用其中一个来表示一小撮要并行完成的独立工作项。
仅一小点:Seq
并且Array
比List
并行性要好。
您有几种选择:PSEQ从F#PowerPack中,Array.Parallel模块和Async.Parallel(异步计算)。由于列表具有顺序性质(head::tail
组成),因此它对于并行执行非常不利。
Array
或PSeq
要好得多。
seq
比list
并行性好?seq
由于它们的顺序性质,它们也很不适合并行执行...
您应该始终Seq
在公共API中公开。在您的内部实现中使用List
和Array
。
Seq
被视为a IEnumerable<T>
?
seq
是因为并行性太差了。