Tuple补遗

  在我前面的文章利用.net泛型实现了一个 Tuple.在这两天的使用中发现还要再加点东西才能好用.有三个地方:1Tuple要想Array,Enum,Delegate一样有一个基类,这样在不确定Tuple类型参个数时可以用这个基类.2.要增加一个判断函数,用来确定任意给定的一个对象是否属于Tuple中的类型(也许再加一个判定是否Tuple内的item的函数).3.增加默认构造,这样做是为了那些只要类型而无需具体对象的场合.
// 只贴出Tuple<T1>和Tuple<T1, T2>的代码,其他的自己加
  public   class  Tuple
    
{
        
public Tuple() {}
       
//具体判断两个类型是否一致
        protected bool JudgeType<T, V>(T t, V v)
        
{
            
return typeof(T).Equals(v.GetType());
        }

        
//Tuple中是否有这种类型
        public virtual bool HasType<V>(V v)
        
{
            
return false;
        }
 
    }
;
    
public   class  Tuple < T1 >  : Tuple
    
{
        T1 _t1;        
        
public Tuple(T1 t1)
        
{
            
this._t1 = t1;
        }

        
public Tuple() : this(default(T1)) {}
        
public T1 Item_1
        
{
            
get{return this._t1;}
        }

        
public override bool HasType<V>(V v)
        
{
            
return base.HasType<V>(v) || this.JudgeType(this._t1, v);
        }
    
    }
;
    
public   class  Tuple < T1, T2 >  : Tuple < T1 >
    
{
        T2 _t2;
        
public Tuple(T1 t1, T2 t2) : base(t1)
        
{
            
this._t2 = t2;
        }

        
public Tuple() : this(default(T1), default(T2)) { }
        
public T2 Item_2
        
{
            
get{return this._t2;}
        }

        
public override bool HasType<V>(V v)
        
{
            
return base.HasType<V>(v) || base.JudgeType(this._t2, v);
        }

    }
;

在这里要说明一下protected bool JudgeType<T, V>(T t, V v)函数,它非常简单就是判断两个类型是否一致.不过要注意它的实现return typeof(T).Equals(v.GetType());其中T代表Tuple中的类型它使用typeof得到类型而v用GetType得到类型.这是因为GetType拿到的是对象的真实类型,而typeof(T)是对象基类型.

class  A1  {}  
class  A2 : A1  {}

Tuple
< A2 >  t  =   new  Tuple < A2 > ();
A1 a1 
=   new  A2();
t.HasType(a1);                    
// 返回true

如果return typeof(T).Equals(typeof(V));会返回false,因为V被认成是A1而不是A2.

06-02
### Tuple 数据结构的定义和用法 #### 一、Tuple 的定义 Tuple 是一种常见的数据结构,广泛存在于多种编程语言中,例如 Python、Scala 和 C++ 等。它是一种有序的、不可变的数据结构(在某些语言中可能具有可变性),可以存储多个元素,且这些元素可以是不同类型的。Tuple 的主要特点是其不可变性(在 Python 和其他类似语言中),这使得 Tuple 在处理固定数据时更加高效和安全[^3]。 在 Python 中,Tuple 的定义为一种有序的、不可变的数据结构,它可以存储多个元素,元素之间用逗号隔开。元组与列表相似,但与列表不同的是,元组一旦创建,其元素不可更改[^5]。 #### 二、Tuple 的用法 1. **Python 中的 Tuple** 在 Python 中,Tuple 的创建非常简单,只需将元素用逗号隔开即可。如果需要明确表示 Tuple,则可以使用括号 `()` 包裹元素。 ```python # 创建 Tuple t = (1, 2, "Python", True) print(t) # 输出: (1, 2, 'Python', True) # 访问 Tuple 元素 print(t[0]) # 输出: 1 ``` Tuple 的不可变性意味着无法修改 Tuple 中的元素,也无法添加或删除元素。这种特性使其适合用于存储固定不变的数据集合[^3]。 2. **C++ 中的 Tuple** 在 C++ 的 STL 库中,`tuple` 是 `pair` 的扩充版,支持存储任意数量的不同类型数据。可以通过 `make_tuple` 函数创建 Tuple,并使用 `get` 函数访问其中的元素。 ```cpp #include <iostream> #include <tuple> int main() { // 使用 make_tuple 创建 Tuple auto t = std::make_tuple(1, 2.5, "C++"); // 使用 get 访问 Tuple 元素 std::cout << std::get<0>(t) << std::endl; // 输出: 1 std::cout << std::get<1>(t) << std::endl; // 输出: 2.5 std::cout << std::get<2>(t) << std::endl; // 输出: C++ return 0; } ``` 在 C++ 中,`tuple` 的元素通过索引编号访问,编号从 0 开始。此外,`tuple` 不支持动态修改元素值,必须通过重新赋值的方式实现[^2]。 3. **Scala 中的 Tuple** 在 Scala 中,Tuple 可以通过 `TupleN` 类型创建,其中 N 表示 Tuple 中的元素个数。Scala 提供了内置方法如 `toString` 来操作 Tuple。 ```scala object Test { def main(args: Array[String]): Unit = { val student = new Tuple3(12, "Rob", "IT") val aString: String = student.toString() println("Concatenated String: " + aString) // 输出: Concatenated String: (12,Rob,IT) } } ``` 上述代码展示了如何创建一个包含三个元素的 Tuple,并将其转换为字符串输出[^4]。 4. **Groovy 和 Hutool 中的 Tuple** 在 Groovy 中,Tuple 的使用类似于其他语言中的实现。而在 Hutool 工具库中,提供了 `Pair`、`Triple` 和通用的 `Tuple` 支持,方便用户根据需求选择合适的结构。例如,`Pair` 可用于存储两个相关联的值,而 `Triple` 则扩展到三个值[^1]。 #### 三、总结 Tuple 是一种灵活且高效的复合数据结构,适用于存储固定不变的数据集合。在不同的编程语言中,Tuple 的具体实现和用法略有差异,但核心思想一致:提供一种轻量级的容器来组织和传递数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值