.NET 3.5 中是否有类似于元组(tuple)的东西?

9
我需要一些像 List<int , int , int ,string , int > 这样的数据类型。当然我可以自己实现,但是在 .net 3.5 中有没有类似的内置类型呢?
谢谢。

1
通常情况下,您会为您的<int,int,int,string,int>创建一个包装类,然后拥有一个List<WrapperClass>。如果您需要在其中一个字段上寻求性能,则使用Dictionary<field,WrapperClass>。 - StuartLC
在系统库中是可以的:Tuple<int, int, string, int> tuple; 这样写是可以的。只需要在构造函数中输入值即可。但你也可以自己创建一个用于保存数据的类或结构体。-1 是因为你应该自己找到这个答案,很容易的。 - MrFox
3
System库2.0/3.5中,您可以在哪里找到Tuple<> - Firo
2
为了弥补MrFox的-1(这是不正确的,更不用说粗鲁了),我给这个问题点了个赞。System.Tuple只出现在.NET 4.0及以后的版本中。 - Mike Loux
8个回答

15

不,.NET 3.5 中没有任何东西。但是与其使用 Tuple,您考虑实现自己的简单类型来封装您需要的成员吗?通常,这比使用 Tuple 更易于阅读代码 - 特别是当您有很多成员时,其中大多数具有相同的类型。

这样更容易理解:

foo(sale.AdultTickets, sale.ChildTickets, ...);
than
foo(sale.Item1, sale.Item2, ...);

多做了一点功夫,但不需要做得非常多。


3
我实现了自己的:
public class Tuple<T1, T2, T3, T4, T5>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }
    public T4 Item4 { get; set; }
    public T5 Item5 { get; set; }

    public Tuple(T1 Item1, T2 Item2, T3 Item3, T4 Item4, T5 Item5)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
        this.Item3 = Item3;
        this.Item4 = Item4;
        this.Item5 = Item5;
    }
}

3

1

0

据我所知,3.5版本不支持元组。


0

很抱歉,没有这个功能。虽然有 KeyValuePair 可以用于元组,但没有内置的三元组、四元组等。


0

不是必须的,但实现Tuple<>泛型类并不太难,尽管对于所有“重载”而言有些繁琐。

codeplex上有一个项目,但我不知道它有多成熟。


-2
你可以使用我的实现 :)
public class Tuple
{
    public static Tuple<T1> Create<T1>(T1 t1)
    {
        return new Tuple<T1>(t1);
    }

    public static Tuple<T1, T2> Create<T1, T2>(T1 t1, T2 t2)
    {
        return new Tuple<T1, T2>(t1, t2);
    }

    public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 t1, T2 t2, T3 t3)
    {
        return new Tuple<T1, T2, T3>(t1, t2, t3);
    }

    static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3, T4 t4)
    {
        return new Tuple<T1, T2, T3, T4>(t1, t2, t3, t4);
    }

    static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5)
    {
        return new Tuple<T1, T2, T3, T4, T5>(t1, t2, t3, t4, t5);
    }

    static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6)
    {
        return new Tuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6);
    }

    static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7)
    {
        return new Tuple<T1, T2, T3, T4, T5, T6, T7>(t1, t2, t3, t4, t5, t6, t7);
    }

    static Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> Create<T1, T2, T3, T4, T5, T6, T7, TRest>(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, TRest Rest)
    {
        return new Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>(t1, t2, t3, t4, t5, t6, t7, Rest);
    }
}

public class Tuple<T1> : Tuple
{
    public T1 Item1 { get; set; }

    public Tuple(T1 Item1)
    {
        this.Item1 = Item1;
    }
}

public class Tuple<T1, T2>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }

    public Tuple(T1 Item1, T2 Item2)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
    }
}

public class Tuple<T1, T2, T3>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }

    public Tuple(T1 Item1, T2 Item2, T3 Item3)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
        this.Item3 = Item3;
    }
}

public class Tuple<T1, T2, T3, T4>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }
    public T4 Item4 { get; set; }

    public Tuple(T1 Item1, T2 Item2, T3 Item3, T4 Item4)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
        this.Item3 = Item3;
        this.Item4 = Item4;
    }
}

public class Tuple<T1, T2, T3, T4, T5>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }
    public T4 Item4 { get; set; }
    public T5 Item5 { get; set; }

    public Tuple(T1 Item1, T2 Item2, T3 Item3, T4 Item4, T5 Item5)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
        this.Item3 = Item3;
        this.Item4 = Item4;
        this.Item5 = Item5;
    }
}

public class Tuple<T1, T2, T3, T4, T5, T6>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }
    public T4 Item4 { get; set; }
    public T5 Item5 { get; set; }
    public T6 Item6 { get; set; }

    public Tuple(T1 Item1, T2 Item2, T3 Item3, T4 Item4, T5 Item5, T6 Item6)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
        this.Item3 = Item3;
        this.Item4 = Item4;
        this.Item5 = Item5;
        this.Item6 = Item6;
    }
}

public class Tuple<T1, T2, T3, T4, T5, T6, T7>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }
    public T4 Item4 { get; set; }
    public T5 Item5 { get; set; }
    public T6 Item6 { get; set; }
    public T7 Item7 { get; set; }

    public Tuple(T1 Item1, T2 Item2, T3 Item3, T4 Item4, T5 Item5, T6 Item6, T7 Item7)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
        this.Item3 = Item3;
        this.Item4 = Item4;
        this.Item5 = Item5;
        this.Item6 = Item6;
        this.Item7 = Item7;
    }
}

public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }
    public T4 Item4 { get; set; }
    public T5 Item5 { get; set; }
    public T6 Item6 { get; set; }
    public T7 Item7 { get; set; }
    public TRest Rest { get; set; }

    public Tuple(T1 Item1, T2 Item2, T3 Item3, T4 Item4, T5 Item5, T6 Item6, T7 Item7, TRest Rest)
    {
        this.Item1 = Item1;
        this.Item2 = Item2;
        this.Item3 = Item3;
        this.Item4 = Item4;
        this.Item5 = Item5;
        this.Item6 = Item6;
        this.Item7 = Item7;
        this.Rest  = Rest;
    }
}

请查看下面的答案,了解代码量和可读性。 - bitoiu
1
@bitoiu 你知道这与微软的实现相同吗?MSDN - Jacinto Gomez
@bitoiu 我已经检查了下面的答案,但是它们都不兼容微软的实现,也许这个MSDN链接可以帮助你澄清我写的内容。 - Jacinto Gomez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接