元组和列表的不同属性通常决定了我们在使用时应该选择哪一种。其中,元组是异构的(heterogeneous),而列表是同构的(homogeneous);元组是不可变的(immutable),而列表是可变的(mutable)。
然而,在其他场景下,这两种数据类型都可以同样适用。因此,元组和列表在内存和/或性能方面有何影响,这也将指导我们做出合适的选择。
谢谢!
元组和列表的不同属性通常决定了我们在使用时应该选择哪一种。其中,元组是异构的(heterogeneous),而列表是同构的(homogeneous);元组是不可变的(immutable),而列表是可变的(mutable)。
然而,在其他场景下,这两种数据类型都可以同样适用。因此,元组和列表在内存和/或性能方面有何影响,这也将指导我们做出合适的选择。
谢谢!
除了您提到的内容之外,还有一个非常重要的区别是元组最多只能包含八个项目。(好吧,您可以使用另一个元组作为最后一个元组参数类型来技术性地创建任意大的元组,但我认为您必须稍微疯狂才能真正这样做。)
与 Python 等语言中的元组不同,C# 中的元组不能真正用作通用数据结构。在 C# 中,元组的最常见用例之一是从函数返回多个值,或将多个值传递给某些原因只能接受一个值的函数(例如,将e.Argument
传递给BackgroundWorker
),或者在您无法费心制作自定义类且无法使用匿名类型的任何其他情况下。
由于您需要在编译时准确知道它们将包含多少项(以及哪些类型的项),因此元组的实际用途非常有限。另一方面,列表用于存储同类数据,您可能不知道将有多少项。我很想看看一段代码的示例,在您的话中,"任何一种数据类型都可能同样适用"。
此外,由于元组和列表解决完全不同的问题,因此比较其内存/性能影响可能相当有限。但是就其价值而言,元组被实现为类,而不是结构体,因此它们与列表一样存储在堆上,并且在函数之间传递时不会被复制,不像值类型。但是,它们确实实现了IStructuralEquatable
和IStructuralComparable
接口,其Equals
方法被实现为这将返回 true:new Tuple<int>(1).Equals(new Tuple<int>(1))
(同时,new List<int>() { 1 }.Equals(new List<int>() { 1 })
是 false)。
Tuple<int, int>[] tuples = ...
和 tuples.OrderByDescending(...)
- xanatos