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.

时间: 2024-09-24 02:47:26

Tuple补遗的相关文章

F#教程:Tuple

tuple是可以将2个以上的数据汇总起来管理的数据类型.要是C#也有就好了. F#的tuple实例代码如下: #light let data = (1,2) printfn "%A" data printfn "%A" (fst data) printfn "%A" (snd data) fst.snd分别表示 First.Second,可以用来取出最初的两个元素.运行结果是: (1, 2) 1 2 (1,2)和1,2都是OK的,有没有()都一样

C++中“tuple”(元组)容器详解

tuple容器(元组), 是表示元组容器, 是不包含任何结构的,快速而低质(粗制滥造, quick and dirty)的, 可以用于函数返回多个返回值; tuple容器, 可以使用直接初始化, 和"make_tuple()"初始化, 访问元素使用"get<>()"方法, 注意get里面的位置信息, 必须是常量表达式(const expression); 可以通过"std::tuple_size<decltype(t)>::valu

在常规的编程任务中使用新的&amp;lt;tuple&amp;gt;库

摘要:Tuples 是大小固定的异构对象集合,它正在被添加到 C++ 标准.学习这种强大的 数据类型有助于简化一些常规的编程任务. C++ 标准委员会目前正在进行标准库的更 新和增强.Tuple 类型是最近添加到 C++ 标准中的内容之一.Tuple 是一个大小固定的异构 对象集合.Tuple 类型非常强大,它有助于简化一些常见的编程任务. 本文代码所依赖的常规编译器均支持 C++ 98 规范,但是目前<tulpe>库还并不一 定是 IDE 标准库的一部分.因此,要想使用这个库必须到 Boos

Python中的元组(tuple) 详解 及 代码

元组是存放任意元素集合,不能修改其内容; len()是求元组的长度, 可以使用下标标示符("[]")去访问元组的数据; 元组内还可以包含元组, 可以通过新建一个元组, 扩充已有的元素; 代码如下: # -*- coding: utf-8 -*- #==================== #File: abop.py #Author: Wendy #Date: 2013-12-03 #==================== #eclipse pydev, python3.3 #元组,

探讨.NET 2.0中Tuple的实现方法

我在介绍Visual Basic 9.0的时候,曾经多次提到Tuple这个概念,当时是作为匿名类型的实例出现的.现在我们单独来讨论一下这个概念.Tuple常常译为"组元",在大部分支持Tuple的语言中,常常表示成员数目确定,每个成员类型也确定的结构.常常用于表示函数的多个返回值或者查询的结果等.Tuple应当是强类型的,即所有成员的类型在编译时确定.比如,假想语法下 Dim t = New Tuple(Of String, Integer, Double) 那么t将具有三个成员,该数

[你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二

Tuple,是函数式编程的概念之一,早见于Elang.F#等动态语言.不过,我第一次听说Tuple还早在2005年园子的Ninputer大牛提出在.NET 2.0实现Tuple的基本想法,我们可以通过以下地址仰慕当时的历史片段: 探讨.NET 2.0中Tuple的实现方法 由此可见,Tuple不是.NET 4.0的创造发明,但却是C#趋于函数式编程概念的必要补充.那么,我们首先来看看,什么是Tuple? Tuple为何物? 什么是Tuple,在汉语上我们将其翻译为元组.Tuple的概念源于数学概

.net4.0中tuple元组的使用方法

 Tuple是.NET 4.0的新特性,主要功能是动态返回数据结构,也可以用做临时数据结构.现在有了元组[Tuple],看看它怎么用 原来做一些功能时需要一个方法返回几个值,有两种方法:   1. 非常难看.难用的OUT参数:   2. 新写一个实体,太麻烦:   现在有了元组[Tuple],看看它怎么做:  代码如下: private void TestTuple() {     var test1 = Test1();     if (test1.Item3 == "Test1")

Python中的tuple元组详细介绍_python

Tuple 是不可变 list. 一旦创建了一个 tuple 就不能以任何方式改变它. Tuple 与 list 的相同之处 定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号. Tuple 的元素与 list 一样按定义的次序进行排序. Tuples 的索引与 list 一样从 0 开始, 所以一个非空 tuple 的第一个元素总是 t[0]. 负数索引与 list 一样从 tuple 的尾部开始计数. 与 list 一样分片 (slice) 也可以使

scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例

package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaApp02 { def main(args: Array[String]) { tupleDemo println mapDemo println arrayDemo println fileWriteAndRead println(getUrlContent("http://www.cnblogs.