C#元组与列表注意事项

C#元组与列表注意事项,c#,list,tuples,C#,List,Tuples,元组和列表的不同属性 元组是异构的,列表是异构的 元组是不可变的,而列表是可变的 通常要求使用一种类型而不是另一种类型。然而,在其他场景中,两种数据类型都同样适用。因此,元组与列表之间的内存和/或性能影响是什么,可能会指导我们的决策? 谢谢,除了你提到的,还有一个非常显著的区别,一个元组最多只能包含八项。(好的,通过让最后一个元组参数键入另一个元组,从技术上讲,您可以创建任意大的元组,但我忍不住觉得,要真正做到这一点,您必须有点疯狂。) 与Python等语言中的元组不同,C#中的元组不能真正

元组和列表的不同属性

  • 元组是异构的,列表是异构的
  • 元组是不可变的,而列表是可变的
通常要求使用一种类型而不是另一种类型。然而,在其他场景中,两种数据类型都同样适用。因此,元组与列表之间的内存和/或性能影响是什么,可能会指导我们的决策?

谢谢,

除了你提到的,还有一个非常显著的区别,一个元组最多只能包含八项。(好的,通过让最后一个元组参数键入另一个元组,从技术上讲,您可以创建任意大的元组,但我忍不住觉得,要真正做到这一点,您必须有点疯狂。)

与Python等语言中的元组不同,C#中的元组不能真正用作通用数据结构。C#中元组最常见的用例之一是从一个函数返回多个值,或者将多个值传递给由于某些原因只能获取一个值的函数(例如,当将
e.Argument
传递给
BackgroundWorker
时),或者任何其他您不必费心创建自定义类的情况,您不能使用匿名类型

由于您需要确切地知道在编译时它们将包含多少项(以及哪些类型的项),所以元组的用途非常有限。另一方面,列表是用于同质数据的通用存储,您不一定知道将拥有多少项。我希望看到一段代码的示例,正如您所说,“任何一种数据类型都可能同样合适”


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

我不认为这是一个话题,所以不管怎样,他们完全不同,因为目的不同,所以通常在他们之间没有选择。当您可能使用元组时,尝试使用列表一点也不自然。应该在知道内容(即域)的情况下做出决定,而不能事先做出决定。此外,还应该考虑集合大小(如果它可以动态地增长)。我们通常使用元组来存储集合的复合键。最近,我们在QA过程的后期进行了一次需求更改,并确定最小侵入性的代码更改是从一个方法返回两个值(Int)(这是我们很少做的事情)。我们使用了一个元组,但也可以使用List.+1,但需要注意的是元组不是可枚举的:-),并且不能在它们上面使用LINQ:-):-)+1@adkserentity,但我要补充的是,元组不是很好的通用解决方案(我只适合于LINQ中间值),因为名称松散。如果你有两个整数,你总是需要依赖文档来知道什么是什么,一个带有专有名称的自定义结构/类更清晰,更不容易出错,而且如果你添加另一个元素,签名也不会改变(元组不是这样)。@xanatos:你大错特错了。看看这里的例子:@Boctulus这个例子是对元组数组排序,而不是对单个元组的元素排序<代码>元组[]元组=和
元组。OrderByDescending(…)