F#中的列表,数组和元组有什么区别?在需要时,它们之间的转换是否容易?它们在精神上看起来都很相似,所以我真正需要知道的是什么才能让我明白何时使用它?
答案 0 :(得分:13)
tuple是一组未命名的有序值。元组中的每个值不需要是相同的类型,这意味着您可以将元组定义为:
let someTuple = (1, "foo", 42.3)
这将创建一个包含int,string和float值的元组。
list是相同类型的值的有序集合,它是不可变的。这可能是函数式编程中最常用的集合类型,因为它完全不可变,并且具有许多用于创建基于先前创建的列表构建的列表的功能,这使得您可以创建"增长的集合。 #34; (然而,它们实际上是新的集合,因为列表是不可变的。)
array是固定大小的可变集合。它们非常有效,但必须始终是单一类型。
在需要时可以轻松转换它们吗?
在列表和数组之间进行转换非常容易。您可以使用List.ofArray
,List.toArray
,Array.ofList
和Array.toList
来转换类型。
从元组转换为数组或列表并不常见,并且并非总是可行,因为元组允许在其中存储多种类型。
他们在精神上似乎都很相似,所以我真正需要知道的是什么让我明白何时使用一个与另一个相比?
列表和数组都用于集合。一般情况下,如果你要制作一个列表" grow&#34 ;,因为制作一个由元素+原始列表组成的新列表会更有效率,你会想要更喜欢列表而不是用数组做同样的事情。
阵列通常用于更高性能的场景(它们具有更好的内存局部性,更节省空间等),但是具有可变和固定的大小,因此当您尝试使用时它们通常不是理想的与构建集合一起工作。
元组通常用于完全不同的场景。元组最常见的用例是将多个项目作为一个值传递。例如,当使用具有out
参数的框架方法时会自动发生这种情况,因此您将看到如下用例:
let (success, value) = int.TryParse(someString)
在这种情况下,会自动创建元组,然后进行模式匹配,以便在一行代码中提取值。它不是将元组视为"集合"而是将多个值(通常是不同类型)保持在一起的方式。
答案 1 :(得分:1)
关于使用集合类型:
列表:您需要一个大小变化的动态集合。 List是单向链表,因此请记住,list的每个成员都需要4或8个字节的附加内存,用于存储指向下一个list元素的指针。
时的数组:您需要存储大量的原始值,如整数,浮点数或字节数。数组表示为值保留的静态内存块,当您必须存储例如图像的字节时,这是有效的。
其他有用的收藏品:
设置时间:您需要存储一套。 Set是一组唯一值。 Set具有用于计算差异,并集和交集的有用函数。例如,您可能拥有所有人(A)和购买糖果(B)的人的集合,因此您现在可以计算A - B = C,现在您设置了C代表没有购买糖果的人。
地图:您需要从一个值到另一个值的投影。现在在前面的例子中你计算了集合C(没有购买糖果的人),你可能用一些id来描述这些人。现在,您可以使用Map:)从此id投射到人物记录。
我希望这很有用。