如何声明和实例化N元组?

时间:2013-05-08 23:52:54

标签: c# tuples

我已经查看了这里的帖子,我发现的任何内容似乎都没有解决我的具体问题。在发布这篇文章时,我误读了N-tuples上的MSDN类别,并且看不出我的N-Tuple无法正常工作的明显原因。我第一次尝试制作N大小的元组,当我尝试分配值时会出错。我想我的语法略有不同。

我的元组:

public Tuple<float, float, float, float, float, float, float, 
     Tuple<float, float, float, float, float, float, float, Tuple<float>>> 
     CollisionTuple = new Tuple<float, float, float, float, float, float, 
     float, Tuple<float, float, float, float, float, float, float, Tuple<float>>>
     (0, 0, 0, 0, 0, 0, 0, Tuple<float, float, float, float, float, float, float>
     (0, 0, 0, 0, 0, 0, 0, Tuple<float>(0)));

那么,我的语法的哪一部分已关闭?在为元组赋值之前的所有内容都不会返回错误。

更新 我只是overloaded方法,并使用array进行碰撞检测。

2 个答案:

答案 0 :(得分:3)

你真的非常接近,你只是忘记了几个new和一个Tuple<float>类型的参数。这有效:

public Tuple<float, float, float, float, float, float, float, 
 Tuple<float, float, float, float, float, float, float, Tuple<float>>> 
 CollisionTuple = new Tuple<float, float, float, float, float, float, 
 float, Tuple<float, float, float, float, float, float, float, Tuple<float>>>
 (0, 0, 0, 0, 0, 0, 0, new Tuple<float, float, float, float, float, float, float, Tuple<float>>
 (0, 0, 0, 0, 0, 0, 0, new Tuple<float>(0)));

正如我在评论中提到的那样,你应该真的尝试简化这个,也许是通过创建一个新类型来封装这里发生的任何事情。您需要调试此对象的实例化这一事实是一个不好的迹象。

答案 1 :(得分:1)

@ dlev的回答是正确的。但是,我建议为此创建一个新类型,以使您的代码更具可读性:

class CollisionTuple : Tuple<float, float, float, float, float, float, float, 
                         Tuple<float, float, float, float, float, float, float, 
                           Tuple<float>>>
{
    CollisionTuple(float f1, float f2, ..., float f15) 
        : Tuple<(7 type arguments...)>(f1, f2, ..., f7, 
              new Tuple<(7 type arguments again...)>(f8, ..., f14,
                  new Tuple<float>(f15))))
    {
    }
}

这样,您可以像这样对其进行实例化:

// where the class is used:
CollisionTuple collTup = new CollisionTuple(0, 0, (etc...), 0);

如果你知道你经常用零来初始化它,你甚至可以创建一个默认的构造函数来为你做这个:

// inside the class, with the other constructor still defined:
CollisionTuple() : CollisionTuple(0, 0, (etc...), 0) { };

这使得使用更加容易:

var collisionTuple = new CollisionTuple();

瞧!所有那些凌乱的泛型和计数参数都已经消失了(或至少在地毯上拂去......)你可以专注于代码的重要部分=)