使用Tuple类在C#中解决问题的真实世界和有效例子

时间:2011-09-11 08:42:28

标签: c# c#-4.0 tuples

我们一直在讨论元组及其各种可能的用途。几乎在所有情况下,它听起来都像邪恶的根源,它使设计变得更糟,并且通常需要一个专门的类而不是可以在任何地方使用的元组。

它应该接近DB,但很难在db持久性逻辑代码中找到Tuple的用法。

有没有任何真实世界好的Tuple使用样本,最好更接近某些现实世界领域模型问题或任何使用实际。

4 个答案:

答案 0 :(得分:4)

据说

Tuple已被引入.NET 4,因为一些编程语言(例如,IronPython或F#)支持元组作为该语言的核心功能,而.NET BCL团队需要为这些语言提供统一的元组类型(我认为语言互操作性的原因):

  

BCL团队决定与F#团队合作,为框架标准化一种元组类型,以便每种语言都能从中受益。(在Eric Lippert对SO问题的回答中,{{ 3}})

Tuple 在C#语言IMHO中没有多大意义,因为C#不支持元组和一些相关的语言结构;例如元组“爆炸”:在函数的参数上传播元组,或者取一个函数的返回值(以Tuple的形式)并将其传播到几个局部变量上:

Tuple<int,int>  GetFoo() { … }
//     v   v
int   (a,  b) = GetFoo();  // C# doesn't support this tuple-related syntax.

话虽这么说,如果你只编写C#代码,你通常可以找到比使用Tuple更“结构化”的解决方案。例如,使用元组从方法返回多个值(例如在上面的GetFoo中)是快速和方便的,但返回值没有任何固有的结构 - 你可能会更好地使用{{ 1}}或struct类型,如果您愿意花些时间来定义它。

答案 1 :(得分:3)

有许多语言可以返回多个值(例如return (a, b)而非使用refout(这些被认为是所有邪恶的另一个根源)。){{ 1}}解决了这个问题。

让我们看看Tuple。它可以在int Math.DivRem(int, int, out int)中重构。如果您认为在这种情况下而不是Tuple,您应该使用特殊类,那么对于代理来说,方向恰恰相反:在创建了100个(实际上是数十个)专门委托之后,MS创建了通用Tuple<int, int> Math.DivRem(int, int)和{{1已经开始使用它们了。

(我们将忽略Tuple是一个类的系列,所以使用它们是“慢”。过早优化和所有美好的东西:-))

我将补充说Action解决了在SO上编写短代码块的问题: - )

答案 2 :(得分:2)

问题是非常开放的,但我无论如何都会尝试。

  1. 元组在本地环境(内部方法)中非常棒,可以缩短算法,就像匿名函数一样。
  2. 如果您使用好的类型(有意义的名称)Tuple<Result, Message>只有Item1Item2的内容不太可读,那么
  3. 这是来自函数式编程的恕我直言(就像Func<_,_>Action<_>)并且有时非常好 - 元组在很大程度上被使用 - 看看F#那里的元组是提供多个功能参数而不是制作
  4. 的方法
      

    返回返回值

    的函数的函数

    例如:)

    只是不要在大图片中使用它们(你可以称之为你的设计)但是对于你的本地实现它们很棒

答案 3 :(得分:0)

您通常不会将它们作为公共接口的一部分公开,这不是它们的意思(至少在C#中)。当你懒得写自己的课时,它们只是派上用场,只是为了解决一个小问题。

我发现词典特别方便。如果你有一个使用由两个或多个属性组成的密钥的私有字典,为了使它能够工作,你需要确保使用按值比较的语义并正确实现哈希代码(或提供自定义{{1 }})。 Comparer已为您执行此操作。