我们在C#中有一些Triple系列吗?

时间:2012-08-18 23:58:21

标签: c# collections

我在考虑为列表的每个对象保留三条信息。 所以我可以为这三个信息创建一个具有三个属性的类,然后创建该类类型的集合......但我想知道在.NET 3.5(而不是4.0)中有任何内置的东西吗?例如一个字典......每个项目,密钥和值保留两条信息...但我需要三条。我们有内置的东西吗?

5 个答案:

答案 0 :(得分:17)

您可以创建自己的Tuple<T1, T2, T3>

public class Tuple<T1, T2, T3> : IEquatable<Object>{
    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 override bool Equals( object obj ) {
        if ( obj == null || (obj as Tuple<T1, T2, T3>) == null ) //if the object is null or the cast fails
            return false;
        else {
            Tuple<T1,T2,T3> tuple = ( Tuple<T1, T2, T3> ) obj;
            return Item1.Equals( tuple.Item1 ) && Item2.Equals(tuple.Item2) && Item3.Equals(tuple.Item3);
        }
    }

    public override int GetHashCode( ) {
        return Item1.GetHashCode( ) ^ Item2.GetHashCode() ^ Item3.GetHashCode();
    }

    public static bool operator == ( Tuple<T1, T2, T3> tuple1, Tuple<T1, T2, T3> tuple2 ) {
        return tuple1.Equals( tuple2 );
    }

    public static bool operator != ( Tuple<T1, T2, T3> tuple1, Tuple<T1, T2, T3> tuple2 ) {
        return !tuple1.Equals( tuple2 );
    }
}

答案 1 :(得分:12)

创建自己的Triple类:

public class Triple<T,X,Y>
{
   public T t{get;set;}
   public X x{get;set;}
   public Y y{get;set;}
}

它比以下方式更清晰,更易于处理:Dictionary<Key, KeyValuePair<X,Y>>和其他类似方法。

答案 2 :(得分:3)

在其他答案中解释了创建类似于.Net 4中添加的通用元组类的解决方案,但我确实认为创建一个小类来语义表示数据可能更好一点很重要你正在存储有意义的属性。通用的3元组现在可能有效,但您可能希望稍后扩展该功能。

答案 3 :(得分:2)

如果您使用的是.NET 4,那么您将寻找Tuple<T1,T2,T3>。 .NET 3.5没有内置类型,但根据您的需要,您可以执行Dictionary<T1,Dictionary<T2,Dictionary<T3,bool>>>

答案 4 :(得分:1)

尝试Dictionary<Key, Tuple<Object, Object>>或者Dictionary<Key, YourClass>,其中YourClass(当然可以是结构)保存两个必需的数据。