zoukankan      html  css  js  c++  java
  • C#(99):自定义集合类

    一、非泛型方式,继承自CollectionBase

    public class MyClass
    {
        public static void Main()
        {
            StringCollection myStringCol = new StringCollection();
            myStringCol.Add("a");
            myStringCol.Add("b");
            Console.Write(myStringCol[0]);
            foreach (string myAnimal in myStringCol)
            {
                Console.Write(myAnimal);
            }
            Console.ReadKey();
        }
    }
    //自定义集合类
    public class StringCollection : CollectionBase
    {
        public void Add(string newAnimal)
        {
            List.Add(newAnimal);
        }
    
        public void Remove(string newAnimal)
        {
            List.Remove(newAnimal);
        }
    
        public StringCollection() { }
    
        public string this[int animalIndex]
        {
            get { return (string)List[animalIndex]; }
            set { List[animalIndex] = value; }
        }
    }

    二、泛型方式,继承自Collection<T>

    下面的代码示例演示如何从构造类型的派生集合类Collection<T>泛型类,以及如何重写受保护InsertItem, RemoveItem, ClearItems,和SetItem方法,以提供自定义行为Add, Insert, Remove,和Clear方法,并设置Item[Int32]属性。
    此示例中提供的自定义行为是Changed每个受保护方法结束时引发的通知事件。
    Dinosaurs类继承Collection<string>,并定义Changed事件,使用DinosaursChangedEventArgs类用于事件信息和使用枚举标识的更改种类。

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    
    public class Dinosaurs : Collection<string>
    {
        public event EventHandler<DinosaursChangedEventArgs> Changed;
    
        protected override void InsertItem(int index, string newItem)
        {
            base.InsertItem(index, newItem);
    
            EventHandler<DinosaursChangedEventArgs> temp = Changed;
            if (temp != null)
            {
                temp(this, new DinosaursChangedEventArgs(
                    ChangeType.Added, newItem, null));
            }
        }
    
        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));
            }
        }
    
        protected override void RemoveItem(int index)
        {
            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));
            }
        }
    }
    
    // Event argument for the Changed event.
    //
    public class DinosaursChangedEventArgs : EventArgs
    {
        public readonly string ChangedItem;
        public readonly ChangeType ChangeType;
        public readonly string ReplacedWith;
    
        public DinosaursChangedEventArgs(ChangeType change, string item, 
            string replacement)
        {
            ChangeType = change;
            ChangedItem = item;
            ReplacedWith = replacement;
        }
    }
    
    public enum ChangeType
    {
        Added, 
        Removed, 
        Replaced, 
        Cleared
    };
    
    public class Demo
    {
        public static void Main()
        {
            Dinosaurs dinosaurs = new Dinosaurs();
    
            dinosaurs.Changed += ChangedHandler; 
    
            dinosaurs.Add("Psitticosaurus");
            dinosaurs.Add("Caudipteryx");
            dinosaurs.Add("Compsognathus");
            dinosaurs.Add("Muttaburrasaurus");
    
            Display(dinosaurs);
        
            Console.WriteLine("\nIndexOf(\"Muttaburrasaurus\"): {0}", 
                dinosaurs.IndexOf("Muttaburrasaurus"));
    
            Console.WriteLine("\nContains(\"Caudipteryx\"): {0}", 
                dinosaurs.Contains("Caudipteryx"));
    
            Console.WriteLine("\nInsert(2, \"Nanotyrannus\")");
            dinosaurs.Insert(2, "Nanotyrannus");
    
            Console.WriteLine("\ndinosaurs[2]: {0}", dinosaurs[2]);
    
            Console.WriteLine("\ndinosaurs[2] = \"Microraptor\"");
            dinosaurs[2] = "Microraptor";
    
            Console.WriteLine("\nRemove(\"Microraptor\")");
            dinosaurs.Remove("Microraptor");
    
            Console.WriteLine("\nRemoveAt(0)");
            dinosaurs.RemoveAt(0);
    
            Display(dinosaurs);
        }
        
        private static void Display(Collection<string> cs)
        {
            Console.WriteLine();
            foreach( string item in cs )
            {
                Console.WriteLine(item);
            }
        }
    
        private static void ChangedHandler(object source, 
            DinosaursChangedEventArgs e)
        {
    
            if (e.ChangeType==ChangeType.Replaced)
            {
                Console.WriteLine("{0} was replaced with {1}", e.ChangedItem, 
                    e.ReplacedWith);
            }
            else if(e.ChangeType==ChangeType.Cleared)
            {
                Console.WriteLine("The dinosaur list was cleared.");
            }
            else
            {
                Console.WriteLine("{0} was {1}.", e.ChangedItem, e.ChangeType);
            }
        }
    }
  • 相关阅读:
    套接字I/O模型-WSAAsyncSelect
    套接字I/O模型-完成端口IOCP
    套接字I/O模型-WSAEventSelect(转载)
    Win7+VS2010环境下CEGUI 0.8.4编译过程详解
    数组去重统计排序
    计算当前月有几天
    前端开发仓库
    Jquery中bind(), live(), on(), delegate()四种注册事件的优缺点,建议使用on()
    图表那些事
    图标字体,矢量图标
  • 原文地址:https://www.cnblogs.com/springsnow/p/2077553.html
Copyright © 2011-2022 走看看