集合泛型的使用

该例子来自于微软官方,虽然讲的很好,但是个人的理解还是非常不到位的。特别是关于委托管理的细节问题,梳理得不是特别清楚。将其摘要于下。也希望牛人将其结构予以较完整的疏离,特别是其中事件触发地方。

该例子是对通过基于集合的泛型类来构建一个自定义的类,并且基于四个方法,重写了其增删改查的操作。

该例子是通过一个改变的改变的通知事件,在每一个方法的最后被触发。其中,DinosaursChangedEventArgs被作为事件信息。

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace Collection_Generic2
{
    class Program
    {
        static void Main(string[] args)
        {
            //初始化类
            dinosaurs dino = new dinosaurs();

            dino.Changed += ChangeHandler;
//这个地方理解的不是很好
            dino.Add("Psiticosaurus");
            dino.Add("Caudipteryx");
            dino.Add("Compsognathus");
            dino.Add("Muttaburrasaurus");

            Display(dino);

            Console.WriteLine("\n IndexOf(\"Muttaburrasaurus\"):{0}", dino.IndexOf("Muttaburrasaurus"));

            Console.WriteLine("\n Contains(\"Caudipteryx\"):{0}",
                dino.Contains("Caudipteryx"));

            Console.WriteLine("\n Insert(2,\"Nanotyrannus\")");
                dino.Insert(2,"Nanotyrannus"); 

            Console.WriteLine("\n dino[2]:{0}",dino[2]);

            Console.WriteLine("\n dino[2]=\"Microraptor\"",
                dino[2]="Microraptor");

            Console.WriteLine("\n Remove (\"Microraptor\")");
            dino.Remove("Microraptor");

            Console.WriteLine("\n RemoveAt(0)");
            dino.RemoveAt(0);

            Display(dino);

            Console.ReadLine();
        }

        private static void ChangeHandler(object source, dinosaursChangedEventArgs e)
        {
            if (e.ChangeType == ChangeType.Replaced)
            {
                Console.WriteLine("{0} was replaced with {1}", e.ChangedItem, e.ReplaceWith);
            }
            else if (e.ChangeType == ChangeType.Cleared)
            {
                Console.WriteLine("The dinosaur list was cleared");
            }
            else
            {
                Console.WriteLine("{0} was {1}", e.ChangedItem, e.ChangeType);
            }
        }

        private static void Display(Collection<string> cs)
        {
            Console.WriteLine();
            foreach (string item in cs)
            {
                Console.WriteLine(item);
            }
        }
    }
}

dinosaurs.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace Collection_Generic2
{
    //继承泛型集合
    class dinosaurs : Collection<string>
    {
        //该处类似于侦查其是否发送改变,一旦发生改变,则触发方法
        public event EventHandler<dinosaursChangedEventArgs> Changed;

        /// <summary>
        /// 重写InsertItem方法
        /// </summary>
        /// <param name="index"></param>
        /// <param name="item"></param>
        protected override void InsertItem(int index, string newItem)
        {
            base.InsertItem(index, newItem);

            EventHandler<dinosaursChangedEventArgs> temp = Changed;

            if (temp != null)//增强稳健型
            {
                //如果发生改变,那么就添加一个新的项目进入指定位置
                //this在这里是什么作用呢?没有想得特别明白
                temp(this, new dinosaursChangedEventArgs(ChangeType.Added, newItem, null));
            }
        }

        /// <summary>
        /// 这个更换的功能的重写
        /// </summary>
        /// <param name="index"></param>
        /// <param name="NewItem"></param>
        protected override void SetItem(int index, string NewItem)
        {
            string replaced = Items[index];
            base.SetItem(index, NewItem);

            EventHandler<dinosaursChangedEventArgs> temp = Changed;

            if (temp != null)
            {
                temp(this, new dinosaursChangedEventArgs(ChangeType.Replaced, replaced, NewItem));
            }
        }

        /// <summary>
        /// 重写移除操作
        /// </summary>
        /// <param name="index"></param>
        protected override void RemoveItem(int index)
        {
            //Items获取其列表的内容
            string removedItem = Items[index];
            base.RemoveItem(index);
            //代理改变这一事件,将其进行赋值
            EventHandler<dinosaursChangedEventArgs> temp = Changed;
            if (temp != null)
            {
                temp(this, new dinosaursChangedEventArgs(ChangeType.Removed, removedItem, null));
            }
        }

        protected override void ClearItems()
        {
            base.ClearItems();

            EventHandler<dinosaursChangedEventArgs> temp = Changed;

            if (temp!=null)
            {
                temp(this,new dinosaursChangedEventArgs(ChangeType.Cleared,null,null));
            }
        }

    }

    /// <summary>
    /// 改变的事件的参数
    /// </summary>
    public class dinosaursChangedEventArgs : EventArgs
    {
        public readonly string ChangedItem;
        public readonly ChangeType ChangeType;
        public readonly string ReplaceWith;

        /// <summary>
        /// 和类名相同,这样它应该算作重载
        /// 其内容是通过重载,对类的三个属性进行赋值
        /// </summary>
        /// <param name="change"></param>
        /// <param name="item"></param>
        /// <param name="replacement"></param>
        public dinosaursChangedEventArgs(ChangeType change, string item, string replacement)
        {
            ChangeType = change;
            ChangedItem = item;
            ReplaceWith = replacement;
        }

    }

    /// <summary>
    /// 将类型的四种操作实现枚举,枚举定义后面需要增加分号
    /// 因为是一个定义,而非方法或类
    /// </summary>
    public enum ChangeType
    {
        Added,
        Removed,
        Replaced,
        Cleared
    };
}
时间: 2024-10-14 16:54:38

集合泛型的使用的相关文章

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质 import java.lang.reflect.Method; import java.util.ArrayList; /** * 通过反射了解集合泛型的本质 * @author shm * */ public class MethodDemo02 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("hello"); list.add(

【DAY12】第十二天集合&泛型&IO学习笔记

hash:散列 ------------------ Hashset集合内部是通过HashMap进行实现的.使用的是HashMap中key部分. 对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和 自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行 &运算,得到介于0和集合容量值之间一个数字.该数字表示着数组的下标. 也就是该元素应该存放在哪个元素中. Map与Collection -------------- Map与Collection在

java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨

//Sets.java package org.rui.generics.set; import java.util.HashSet; import java.util.Set; /** * 一个Set有用工具 * @author lenovo * */ public class Sets { public static<T> Set<T> union(Set<T> a,Set<T> b) { Set<T> result=new HashSet&

reflect 反射结合集合泛型的总结

集合泛型: 可以放任何对象的 ArrayList  ArrayList list = new ArrayList();  没有限定泛型类型. list.add("lilin");list.add(100);System.out.println(list);//很容得知结果能够是["lilin",100]; ArrayList<String> list1 = new ArrayList<String>(); 限定了只能存放String类型的数据

JAVA-基础(集合 泛型)

JAVA-基础(集合 泛型) 1.什么是泛型? 可以在类或方法中预支地使用未知的类型. 2.泛型的好处? 将运行时期的ClassCastException,转移到了编译时期变成了编译失败. 避免了类型强转的麻烦.(集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型.当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换.此时我存intger类型,转成string,就会发生了问题java.lang.ClassCastException.怎么来解决这

Java反射的理解(六)-- 通过反射了解集合泛型的本质

Java反射的理解(六)-- 通过反射了解集合泛型的本质 上述写了那么多,我们可能会有个疑问,为什么要用反射,步骤比我们常规的加载类操作复杂多了,别急,这个问题我最后才解答,我们先来了解集合泛型的本质. 直接上代码: import java.lang.reflect.Method; import java.util.ArrayList; public class MethodDemo4 { public static void main(String[] args) { ArrayList li

java随手笔记之八集合泛型

Object:根类        toString,equals,hashCode包裹类:8个,Integer,Character        xxx parseXxx(),自动装箱(new Xxx())和自动拆箱(intValue())字符串类:    String:final类,不可改变的Unicode,返回新的字符串对象    StringBuffer,StringBuilder:final类,可改变的Unicode,返回原缓冲区的字符串对象数学类:    Math:静态        

集合泛型回顾加强

一.谈起集合,首先应该想到一个图,如下: 二.记住set与list的特征和区别: set是无序且不可重复,list是有序可重复. 三.linkedlist与ArrayList的区别: 选用list时候用linedlist还是arraylist也要看他们的特点来区别对待: linkedlist是用链表来实现的,修改容易,查找困难,而ArrayList是用数组实现的,查找容易,但修改就很繁琐,这个是为啥呢?我先查一查,再在这里补充. 四.泛型 泛型主要是针对jdk1.5之前,类型混乱,装入集合的类型

Java--Reflect(反射)专题6——通过反射了解集合泛型的本质

转载请注明:http://blog.csdn.net/uniquewonderq 通过Class,Method来认识泛型的本质 反射的操作都是编译之后的操作,即运行时刻进行操作 c1==c2结果返回true,说明编译之后,集合的泛型是去泛型化的 就是说编译之后这个集合没有泛型了. java中集合的泛型是防止错误输入的,只在编译阶段有效, 过了编译就无效了. 验证:我们可以通过方法的反射来操作,绕过编译 package com.test; import java.lang.reflect.Meth