c#,使用集合对元素的添加,删除等操作(二) - Angel's Blog.

ing
 
 
软件开发,程序设计,前端设计
 
 
首页 > code > c#,使用集合对元素的添加,删除等操作(二)

c#,使用集合对元素的添加,删除等操作(二)

 

先示例一个有问题的demo,这里使用到了Student类和Teacher类:

demo:

//Student 类
--------------------- separateLine start------------------
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="age"></param>
        /// <param name="gender"></param>
        /// <param name="hobby"></param>
        public Student(string name , int age , Genders gender , string hobby ) ...
        /// <summary>
        /// 字段
        /// </summary>
        private int _Age;
        private string _Name;
        private string _Hobby;
        public enum Genders...
        private Genders _Gender;
        public Genders Gender...
        public string Hobby...
        public string Name...
        public int Age...
        /// <summary>
        /// 方法
        /// </summary>
        /// <returns></returns>
        public string voice()...
--------------------- separateLine over------------------

 

 

 

//Teacher 类
--------------------- separateLine start------------------
        public Teacher() { }
        /// <summary>
        /// 带参的构造函数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="age"></param>
        /// <param name="salary"></param>
        /// <param name="servingYear"></param>
        public Teacher(string name , int age , int salary , int servingYear)...
        /// <summary>
        /// 字段
        /// </summary>
        private int _Age;
        private string _Name;
        private int _Salary;
        private int _ServingYears;

        public int ServingYears...
        public int Salary...
        public string Name...
        public int Age...
        /// <summary>
        /// 方法
        /// </summary>
        /// <returns></returns>
        public string SayHi() ...

--------------------- separateLine over------------------

 

 

在button2的按钮中:

 

        private void button2_Click(object sender, EventArgs e)
        {
            ArrayList students = new ArrayList();
            Student xiaoA = new Student("xiaoA", 18, Student.Genders.Female, "唱歌");
            Student fangfang = new Student("fangfang", 22, Student.Genders.Female, "dance");
            //实例一个老师对象:
            Teacher teacherZhang = new Teacher("teacherZhang", 45, 1000, 10);

            students.Add(xiaoA);
            students.Add(fangfang);
            //将老师的对象添加到ArrayList里。
            students.Add(teacherZhang);
            foreach (object stuo in students)
            {
                Student stuFore = (Student)stuo;//如果这样写,会出错,因为Teacher对象也同样和Student一样,为object类型
                MessageBox.Show(stuFore.Name);
            }
        }

 

如果这样添加了Teacher的一个实例到集合中,强制转换成Student类型,但是在遍历的过程中抱错出ex,
其实这个是和ArrayList的类型有关;ArrayList默认认为添加的元素为object,同理,HashTable也一样,
因此,有必要将添加的元素进行约束check。

demo1(将刚才的demo中的部分代码进行修改):

 

 

            //修改成如下:
            List<Student> students = new List<Student>();//这里定义的List<Student>集合,只接受Student类型的元素。
            Student xiaoA = new Student("xiaoA", 18, Student.Genders.Female, "唱歌");
            Student fangfang = new Student("fangfang", 22, Student.Genders.Female, "dance");
            Teacher teacherZhang = new Teacher("teacherZhang", 45, 1000, 10);

            students.Add(xiaoA);
            students.Add(fangfang);
            //students.Add(teacherZhang);//立即会出现下划线tip错误。

            foreach (Student stu in students)
            {
                MessageBox.Show(stu.Name);//无需类型转换
            }

 

在这里定义的List<Student>,表示这个集合只能接受Student类型的元素,
将Teacher类型元素添加进去则tip错误;除此之外,使用foreach进行遍历,无须强制转换,
这种集合就是传说中的泛型集合

 

1、泛型的优势:

1)性能高,无需在遍历或者访问元素的过程中强制转换或者进行类型转换(例如在demo中的ArrayList,
添加一个值类型元素就要转换成引用类型,访问元素则需要再转换成值类型)。

2)安全:对存储的元素(对象)进行类型的约束(demo1中体现其优势)。

 

2、泛型集合List<T>:

同样地,使用List<T>和ArrayList类似。

定义的泛型集合List<T>:

 

            List<T> t = new List<T>();

 

这里的T(大T)就是对这个泛型集合添加的元素类型进行约束,且这个泛型要实例化,
其他用法和ArrayList基本类似。

demo2:

 

        private void button3_Click(object sender, EventArgs e)
        {
            List<Student> students = new List<Student>();//这里定义的List<Student>集合,只接受Student类型的元素。
            Student xiaoA = new Student("xiaoA", 18, Student.Genders.Female, "唱歌");
            Student fangfang = new Student("fangfang", 22, Student.Genders.Female, "dance");
            Teacher teacherZhang = new Teacher("teacherZhang", 45, 1000, 10);

            students.Add(xiaoA);
            students.Add(fangfang);
            //students.Add(teacherZhang);//立即会出现下划线tip错误。
            Student stu1 = students[1];
            MessageBox.Show(stu1.voice());
            MessageBox.Show(string.Format("共包括{0}个成员", students.Count.ToString()));
            students.RemoveAt(1);
            MessageBox.Show(string.Format("删除一个元素后共包括{0}个成员", students.Count.ToString()));
            foreach (Student stu in students)
            {
                MessageBox.Show(stu.Name);//遍历不需要类型转换。
            }
        }

 

3、泛型集合Dictionary<K,V>的使用:

 

泛型集合Dictionary<K,V>的特征:

1)检查类型的约束;

2)获取元素不需要强制转换或者类型转换,存储方式类似于HashTable,通过Key/Value保存元素。
定义的泛型集合Dictionary<K,V>:

 

            Dictionary<K, V> dic = new Dictionary<K, V>();

 

 

这里的K 就是集合的Key(键) 的类型,V 表示Value(给定的值) 类型:

demo3:

 

        private void button1_Click(object sender, EventArgs e)
        {
            Dictionary<String, Student> students = new Dictionary<string, Student>();
            Student Aaron = new Student("Aaron", 25, Student.Genders.Male, "wow");
            Student Juzhang = new Student("Juzhang", 26, Student.Genders.Male, "juhuacan");
            students.Add(Aaron.Name , Aaron);
            students.Add(Juzhang.Name , Juzhang);
            MessageBox.Show(string.Format("总计{0}个学员", students.Count.ToString()));
            Student stu1 = students["Juzhang"];//通过key访问
            MessageBox.Show(stu1.voice());
            foreach (Student stu in students.Values)//通过遍历students的values,类似于hashTable中的使用方法。
            {
                MessageBox.Show(stu.Name);
            }
            students.Remove("Aaron");
            MessageBox.Show(string.Format("通过key删除元素后,剩余{0}个学员" , students.Count.ToString()));
        }

 

泛型的总结:

1)解决繁琐操作问题:在添加或者访问元素的过程中,不需要再进行类型转换,且编译速度更有效率。

2)解决了非类型的元素添加,增强安全性,对即将添加的元素进行约束check。

3)使用泛型可以作为类中的一个属性,使用泛型要实例化。

 

 

或者通过RSS 关注本站的更新 ^ O ^ 。” —  by  转载请注明:来自 Angel's Blog.
本文永久链接: http://www.0ee.com/2010/11/17/c-sharp-collection-list-of-control-para2.html
 
分类: code标签: , ,
 
  • QQ书签
  • Del.icio.us
  • 百度收藏
  • Google
  • 饭否
  • FriendFeed
 

 
评论 (24) Trackbacks (0)
发表评论 Trackback
 
24 Comments Contributed by Visitors
  1.     希尔 2010年11月19日03:13 21#

    micolog上提供的那个Akismet 评论过滤插件 v0.3.1插件怎么用啊?我已经把他上传了,在后台也激活了,但是为什么人家的留言还是直接 显示啊?该怎么弄才能做得像别人那样需要自己审核才能显示留言评论,最近老是有垃圾人在刷留言。。博主能不能做个文章详细说明下,我不是学这些的,看不太明白。。

  2.     Angel 2010年11月19日03:31 22#

    @希尔
    那个Akismet 插件用着也不错的,你把那个插件放到 plugins目录下 ,上传到google app engine,上传完成后到后台active 就ok了,一般的spam都能拦截到。

  3.     希尔 2010年11月19日06:08 23#

    @Angel

    那怎么才能做得像博主这样的效果,能不能具体分享下,我不会这些啊呜呜呜呜

  4.     Angel 2010年11月18日23:48 24#

    @冰棱 有办法实现评论嵌套么?

    测试一下评论引用,貌似嵌套这个用上了循环了吧?还有,之前我曾去你的blog留言,要求你从那篇文章编辑掉那个ip地址你怎么到现在还没编辑掉呢?

Leave Comments Here...

:) :-D :( :-o 8-O :-? 8) lol :-x :-P oops cry evil twisted wink ? idea :-| arrow mrgreen roll !

(required)

(required)

网址随您("http://"可以省略)

(Ctrl+Enter)

  • 本站不会泄露您的 Email 地址, 敬请放心.
  • 本站已开启缓存, 请不要重复提交评论.
  • 请注意: 带有 《广告(链)、不健康、或者 产品名字》 的评论一律视为spam.
  • 支持常用 HTML 标签调用, 插入 HTML 标签需注意: < == &lt;> == &gt;.
  • 仅当某人针对您的评论做出回应时, 您才会收到由本站发出的邮件通知.
  • 如您希望以相同方式通知某位网友, 请点击  按钮进行回复.
  • 允许在评论中使用如下代码: 
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> 
    <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 
    .
  • 鼠标悬浮到评论中的 @someone 区域即可自动显示 someone 的评论内容.
 
 
  • 正在加载...