看陈广老师c#参考视频总结(第九篇)

日期:2008-6-14
学习内容:索引器
遗留问题:
学习总结:
1.       索引器

 

索引器(indexer):索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似与属性,不同之处在于它们的访问器采用参数。
数组类的使用实例:
using System;//引用System命名空间

class Arrclass

{

    private readonly string name;

    public Arrclass(string name)//Arrclass的构造函数,并且带有参数name

    {

        this.name = name;

    }

    public string Name //定义一个只读访问器Name

    {

        get

        {

            return name;

        }

    }

}

class Test

{

    static void Main()

    {

        Arrclass[] a=new Arrclass[10];//定义一个存储Arrclass类实例的数组,并且指定长度为个元素

        a[0]=new Arrclass("张三");//利用数组下标索引,给数组赋值

        a[1]=new Arrclass("李四");

        a[2]=new Arrclass("王五");

        Console.WriteLine("a[0]="+a[0].Name);//输出Arrclass类实例的数组中元素的值

        Console.WriteLine("a[1]="+a[1].Name);

        Console.WriteLine("a[2]="+a[2].Name);

    }

}

索引器的使用实例:

using System;//引用System命名空间

class Indexclass

{

    private string[] name = new string[10];//定义一个字符型数组,数组的长度为,把它作为类的一个私有成员

    public string this[int index]//定义索引器,它有点像属性,只不过是带参数

    {

        get

        {

            return name[index];

        }

        set

        {

            name[index] = value;

        }

    }

}

class Test

{

    static void Main()

    {

        Indexclass b = new Indexclass();//声明一个Indexclass类的实例

        b[0] = "张三";//为实例赋值

        b[1] = "李四";

        b[2] = "王五";

        Console.WriteLine("b[0]=" + b[0]);

        Console.WriteLine("b[1]=" + b[1]);

        Console.WriteLine("b[2]=" + b[2]);

    }

}

索引器除了索引值为整型外,还可以为其他类型,用其他类型的索引值,需要用到HashTable

 

 

.net framework中,HashtableSystem.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtablekey/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。、

索引值为字符串型的实例:

using System;//引用System命名空间

using System.Collections;//引用此命名空间,因为Hashtable类包含在其中

class Indexclass

{

    private Hashtable name = new Hashtable();//声明一个Hashtable类的实例并把他作为Indexclass类的成员

    public string this[string index]//定义索引器,它有点像属性,只不过是带参数,并且索引值为字符串型

    {

        get

        {

            return name[index].ToString();//因为Hashtable类的键值返回的是object类型,需要把他转换成字符串型

        }

        set

        {

            name.Add(index, value);//Hashtable中写入值需要用它本身的add方法

        }

    }

}

class Test

{

    static void Main()

    {

        Indexclass b = new Indexclass();//声明一个Indexclass类的实例

        b["A001"] = "张三";//为实例赋值

        b["A002"] = "李四";

        b["A003"] = "王五";

        Console.WriteLine("b['A001']=" + b["A001"]);

        Console.WriteLine("b['A002']=" + b["A002"]);

        Console.WriteLine("b['A003']=" + b["A003"]);

    }

}

还有一个知识点需要说明:索引器可以重载,下面通过一个实例说明重载。本例的功能是可以通过学号查找学生姓名,或者姓名查找学生学号

using System;//引用System命名空间

using System.Collections;//引用此命名空间,因为Hashtable类包含在其中

class Indexclass

{

    private Hashtable name = new Hashtable();//声明一个Hashtable类的实例并把他作为Indexclass类的成员

    public string this[int index]//定义索引器,它有点像属性,只不过是带参数,并且索引值为字符串型

    {

        get

        {

            return name[index].ToString();//因为Hashtable类的键值返回的是object类型,需要把他转换成字符串型

        }

        set

        {

            name.Add(index, value);//Hashtable中写入值需要用它本身的add方法

        }

    }

    public int this[string aName]//定义索引器,和上一个索引器构成重载

    {

        get

        {

            foreach (DictionaryEntry d in name)

            {

                if (d.Value.ToString() == aName)

                    return Convert.ToInt32(d.Key);

            }

            return -1;

        }

        set

        {

            name.Add(value, aName);

        }

    }

}

class Test

{

    static void Main()

    {

        Indexclass b = new Indexclass();//声明一个Indexclass类的实例

        //调用A索引器

        b[100] = "张三";//为实例赋值

        b[200] = "李四";

        b[300] = "王五";

        Console.WriteLine("编号为100的员工是:" + b[100]);

        Console.WriteLine("编号为200的员工是:" + b[200]);

        Console.WriteLine("编号为300的员工是:" + b[300]);

        Console.WriteLine();

        //调用B索引器

        Console.WriteLine("张三的编号是:" + b["张三"]);

        Console.WriteLine("李四的编号是:" + b["李四"]);

        Console.WriteLine("王五的编号是:" + b["王五"]);

        //调用A索引器,实际开发中并不会这样用

        b["赵六"] = 400;

        b["钱七"] = 500;

        Console.WriteLine();

        Console.WriteLine("编号为400的员工是:" + b[400]);

        Console.WriteLine("编号为500的员工是:" + b[500]);

    }

}

 

索引器和数组的比较:

1.     索引器的索引值(index)类型不受限为整数;用来访问数组的索引值(index),其类型一定为整数,然而索引器可以定义其他类型的索引值。

2.     索引器允许重载(overloading)

3.     索引器不是一个变量;索引和数组的不同地方在于,索引器并没有直接对应应用数据存储地方,而数组则有。索引器有get访问器和set访问器,用来知名要读取或写入索引元素时,需要执行的代码。

 

索引器与属性的不同点:

1.     标识方式:属性以名称来标识;索引器则以函数签名来标识。

2.     索引器可以被重载:因为属性是以名称标识的,所以不能被重载;索引器是用函数签名标识的,因此可以重载。

3.     索引器不可以声明为static:属性可以为static,而索引器永远属于实例成员,不能为static.

带有多参数的索引器的使用范例:

using System;

using System.Collections;

//定义一个学生类,包括学生的姓名,课程ID,成绩

class CourseScore

{

    private string name;

    private int courseID;

    private int score;

    public CourseScore(string name,int courseID,int score)

    {

        this.name = name;

        this.courseID = courseID;

        this.score = score;

    }

    public string Name

    {

        get

        {

            return name;

        }

        set

        {

            name = value;

        }

    }

    public int CourseID

    {

        get

        {

            return courseID;

        }

        set

        {

            courseID = value;

        }

    }

    public int Score

    {

        get

        {

            return score;

        }

        set

        {

            score = value;

        }

    }

}

//定义一个CourseScoreIndexer类的索引器

class CourseScoreIndexer

{

    private ArrayList arrCourseScore;//声明一个ArrayList类的对象

    public CourseScoreIndexer()

    {

        arrCourseScore = new ArrayList();

    }

    public int this[string name, int courseID]

    {

        get

        {

            foreach (CourseScore cs in arrCourseScore)

            {

                if (cs.Name == name && cs.CourseID ==courseID)

                    return cs.Score;

            }

            return -1;

        }

        set

        {

            arrCourseScore.Add(new CourseScore(name,courseID,value));

        }

    }

}

class Test

{

    static void Main()

    {

        CourseScoreIndexer csi = new CourseScoreIndexer();

        csi["张三", 2] = 90;

        csi["李四", 1] = 80;

        csi["张三", 1] = 85;

        csi["李四", 2] = 75;

        Console.WriteLine(csi["张三", 2]);

    }

}

如何实现把张三的全部成绩打印出来呢?索引器重载

using System;

using System.Collections;

//定义一个学生类,包括学生的姓名,课程ID,成绩

class CourseScore

{

    private string name;

    private int courseID;

    private int score;

    public CourseScore(string name,int courseID,int score)

    {

        this.name = name;

        this.courseID = courseID;

        this.score = score;

    }

    public string Name

    {

        get

        {

            return name;

        }

        set

        {

            name = value;

        }

    }

    public int CourseID

    {

        get

        {

            return courseID;

        }

        set

        {

            courseID = value;

        }

    }

    public int Score

    {

        get

        {

            return score;

        }

        set

        {

            score = value;

        }

    }

}

//定义一个CourseScoreIndexer类的索引器,用以存储和查询CourseScore

class CourseScoreIndexer

{

    private ArrayList arrCourseScore;//声明一个ArrayList类的对象

    public CourseScoreIndexer()

    {

        arrCourseScore = new ArrayList();

    }

    public int this[string name, int courseID]

    {

        get

        {

            foreach (CourseScore cs in arrCourseScore)

            {

                if (cs.Name == name && cs.CourseID ==courseID)

                    return cs.Score;

            }

            return -1;

        }

        set

        {

            arrCourseScore.Add(new CourseScore(name,courseID,value));

        }

    }

    public ArrayList this[string name]

    {

        get

        {

            ArrayList tmparr = new ArrayList();

            foreach (CourseScore cs in arrCourseScore)

            {

                if (cs.Name == name)

                    tmparr.Add(cs);

            }

            return tmparr;

        }

    }

}

class Test

{

    static void Main()

    {

        CourseScoreIndexer csi = new CourseScoreIndexer();

        csi["张三", 2] = 90;

        csi["李四", 1] = 80;

        csi["张三", 1] = 85;

        csi["李四", 2] = 75;

        Console.WriteLine(csi["张三", 2]);

        Console.WriteLine("张三的所有课程成绩为:");

        ArrayList arrtemp;

        arrtemp=csi["张三"];

        foreach (CourseScore cs in arrtemp)

            Console.WriteLine("姓名为:" + cs.Name + "课程号:" + cs.CourseID + "成绩:" + cs.Score);

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章