【问题标题】:C# Tuple versus List ConsiderationsC# 元组与列表注意事项
【发布时间】:2013-09-06 15:03:18
【问题描述】:

元组和列表的不同属性;

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

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

【问题讨论】:

  • 我不认为这是 SO 的主题,无论如何 IMO 他们 完全不同 因为意图所以通常没有 选择他们。当您可以使用 Tuple 时,尝试使用 List 根本不是自然。应该在知道内容(= )的情况下做出决定,并且不能先验做出决定。此外,您还应该考虑集合 size(如果它可以动态增长)。
  • 我们通常使用元组来存储集合的复合键。我们最近在 QA 流程后期进行了需求更改,并确定侵入性最小的代码更改是从方法返回两个值(整数)(我们很少这样做)。我们使用了 Tuple,但也可以使用 List.

标签: c# list tuples


【解决方案1】:

嗯,除了您提到的之外,还有一个相当显着的区别,即一个元组最多只能包含八个项目。 (好吧,您可以技术上通过使最后一个元组参数类型为另一个元组来创建任意大的元组,但我不禁觉得你必须有点疯狂才能真正做到这一点。)

与 Python 等语言中的元组不同,C# 中的元组不能真正用作通用数据结构。 C# 中元组最常见的用例之一是从函数返回多个值,或者将多个值传递给由于某些原因只能取一个的函数(例如,将 e.Argument 传递给 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 :-) :-)
  • +1 @adkSerenity 但我要补充一点,元组并不是很好的通用解决方案(IMO 仅适用于 LINQ 中间值),因为您丢失了 names。如果你有两个整数,你总是必须依靠文档来知道什么是什么,一个具有正确名称的 custom struct/class 会更清晰,更不容易出错,并且如果你添加签名也不会改变另一个元素(元组不是这样)。
  • @xanatos:你错了。看这里的例子:dotnetperls.com/orderbydescending
  • @Boctulus 该示例是对一个元组数组进行排序,而不是对单个元组的元素进行排序。 Tuple<int, int>[] tuples = ... tuples.OrderByDescending(...)
猜你喜欢
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2010-11-01
相关资源
最近更新 更多