C#元组与列表注意事项

Sey*_*our 5 c# tuples list

元组和列表的不同属性;

  • 元组是异构的,列表是同质的,
  • 元组是不可变的,而列表是可变的,

通常要求使用一种类型而不是另一种类型.但是,在其他情况下,任何一种数据类型都可能同样合适.因此,元组与列表的内存和/或性能影响是什么,也可能指导我们的决策?
谢谢,

Mag*_*ken 11

好吧,除了你提到的内容之外,元组最多只能包含8个项目,这是一个相当大的区别.(好吧,你可以通过使最后一个元组参数类型为另一个元组来技术上制作任意大的元组,但我不禁觉得你必须有点疯狂才能真正做到这一点.)

与Python这样的语言中的元组不同,C#中的元组不能真正用作通用数据结构.C#中元组最常见的用例之一是从函数返回多个值,或者将多个值传递给函数,这些函数由于某些原因只能占用一个(例如,当传递e.Argument给a时BackgroundWorker),或者任何其他情况你可以不习惯制作自定义类,并且不能使用匿名类型.

由于您需要确切地知道它们在编译时将包含多少项(以及哪些类型的项),因此元组的使用确实非常有限.另一方面,列表用于同类数据的通用存储,其中您不一定知道您将拥有多少项.我很乐意看到一段代码的例子,正如你所说,"数据类型可能同样合适".

此外,由于元组和列表解决了完全不同的问题,因此比较内存/性能影响的兴趣可能相当有限.但是对于它的价值,元组是作为类而不是结构实现的,所以它们就像列表一样存储在堆上,并且在函数之间传递它们时不会复制它们,这与值类型不同.然而,它们实现了IStructuralEquatableIStructuralComparable接口,并且实现了它们的Equals方法,使得它将返回true :( new Tuple<int>(1).Equals(new Tuple<int>(1))同时,new List<int>() { 1 }.Equals(new List<int>() { 1 })为false).

  • +1但是添加作为一个注释,元组不是可枚举的:-)并且你不能LINQ超过它们:-) :-) (4认同)