C#元组 Pair Triplet Tuple(转)

C#默认提供了Pair、Triplet 、Tuple(4.0新增加的)这三个元组,在一些小的数据结构使用时,我们可以不用去声明相应的数据结构,而用这些元组来替代。

public sealed class Pair  
{  
    // Fields  
    public object First;  
    public object Second;  
  
    // Methods  
    public Pair()  
    {  
    }  
  
    public Pair(object x, object y)  
    {  
        this.First = x;  
        this.Second = y;  
    }  
} 
[Serializable]  
public sealed class Triplet  
{  
    // Fields  
    public object First;  
    public object Second;  
    public object Third;  
  
    // Methods  
    public Triplet()  
    {  
    }  
  
    public Triplet(object x, object y)  
    {  
        this.First = x;  
        this.Second = y;  
    }  
  
    public Triplet(object x, object y, object z)  
    {  
        this.First = x;  
        this.Second = y;  
        this.Third = z;  
    }  
}  

以上这2个东东是表示2个、3个属性的可序列化对象。但是大家一定要注意它们的属性都是object,命名空间是System.Web.UI也就是说它们在System.Web.dll

 

在。net4.0中 C#新增了Tuple 可以表示1-8个强类型属性的对象,在mscorlib.dll的System命名空间

public static class Tuple  
{  
    // Methods  
    internal static int CombineHashCodes(int h1, int h2)  
    {  
        return (((h1 << 5) + h1) ^ h2);  
    }  
  
    internal static int CombineHashCodes(int h1, int h2, int h3)  
    {  
        return CombineHashCodes(CombineHashCodes(h1, h2), h3);  
    }  
  
    internal static int CombineHashCodes(int h1, int h2, int h3, int h4)  
    {  
        return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4));  
    }  
  
    internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5)  
    {  
        return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), h5);  
    }  
  
    internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6)  
    {  
        return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6));  
    }  
  
    internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7)  
    {  
        return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7));  
    }  
  
    internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8)  
    {  
        return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8));  
    }  
  
    public static Tuple<T1> Create<T1>(T1 item1)  
    {  
        return new Tuple<T1>(item1);  
    }  
  
    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)  
    {  
        return new Tuple<T1, T2>(item1, item2);  
    }  
  
    public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)  
    {  
        return new Tuple<T1, T2, T3>(item1, item2, item3);  
    }  
  
    public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)  
    {  
        return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);  
    }  
  
    public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)  
    {  
        return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);  
    }  
  
    public static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)  
    {  
        return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);  
    }  
  
    public static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)  
    {  
        return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);  
    }  
  
    public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)  
    {  
        return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));  
    }  
}  

其中的Tuple<...>都有[Serializable]属性表示可序列化。可见Tuple只是一个简单的工厂,使用它可以创建Tuple<...>类型的对象了。

 

至于使用我就不多说了,个人还是建议大家用Tuple而不要使用Pair 和Triplet

 
posted @ 2013-12-17 09:31  邹邹  Views(528)  Comments(0)    收藏  举报