189 8069 5689

C#自定义集合-创新互联

C#自定义集合

站在用户的角度思考问题,与客户深入沟通,找到桥西网站设计与桥西网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都网站制作、企业官网、英文网站、手机端网站、网站推广、主机域名网站空间、企业邮箱。业务覆盖桥西地区。


     对于基于Unity游戏引擎来深入开发商业级高品质游戏的广大游戏开发人员来说,使用C#语言来开发诸如“对象缓冲池”等技术应用来说,开发我们的“自定义集合”是非常必要的。

    根据笔者经验,一个好的C#"自定义集合"需要满足以下需求:

  1: 可以使用foreach 方便的遍历集合元素。
   2: 采用索引器技术,提供直接的方式访问或者赋值内部元素。

  3: 提供类似 IList 接口的常用访问方法:
     Add() 、Clear()、Insert()、Remove()

   本技术需要读者提前具备集合、索引器等相关知识(读者可以看笔者以前博客介绍文章),为了好说明,先给出4个演示类,组成一个C#自定义集合的演示示例。

第一个: 实体类

   public class Person
    {
        //public static int i;
        private string _Name;
        private int _Age;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        public int Age
        {
            get { return _Age; }
            set { _Age = value; }
        }

        //public Person()
        //{
        //    i++;
        //    name = "张三" + i.ToString();
        //}

        public Person(string strName,int intAge)
        {
            _Name = strName;
            _Age = intAge;
        }
    }

第二个: 集合核心类

   public class PersonCollection:IEnumerable //表示可遍历可枚举的集合接口
    {
        //保存Object 类型的 数组。
        ArrayList al = new ArrayList();

        ///


        /// 实现了IEnumberable 后,返回一个迭代器对象,但具体的接口子类由程序员
        /// 自己定义。
        ///

        ///
        public IEnumerator GetEnumerator()
        {
            return new MyGetEnumberater(this.al);
        }

        ///
        /// 索引器
        ///

        ///
        ///
        public Person this[int index]
        {
            get { return (Person)al[index]; }
        }

        public void Add(Person p)
        {
            al.Add(p);
        }

        public void AddRange(ICollection ip)
        {
            al.AddRange(ip);
        }

        public void Clear()
        {
            al.Clear();
        }

        public void Insert(int index,Person value)
        {
            al.Insert(index,value);
        }

        public int IndexOf(Person p)
        {
            return al.IndexOf(p);
        }

        public void RemoveAt(int index)
        {
            al.RemoveAt(index);
        }

        public void Remove(Person p)
        {
            if(al.Contains(p))
            {
                int temp = IndexOf(p);
                RemoveAt(temp);
            }
        }
    }//Class_end

第3个: 自定义的“迭代器”类

   public class MyGetEnumberater:IEnumerator
    {
        int i = 0;
        ArrayList ps;

        public MyGetEnumberater(ArrayList p)
        {
            ps = p;
        }

        ///


        /// 得到当前元素
        ///

        public object Current
        {
            get { return ps[i++]; }  //注意这里的i++ ,是先运算再自增。
            //相当于
            //object o=ps[i];
            //i++;
            //return o;

        }

        ///
        /// 移动到下一个元素
        ///

        ///
        public bool MoveNext()
        {
            if (i > ps.Count - 1)
            {
                return false;
            }
            return true;
        }

        //重置
        public void Reset()
        {
            i = 0;
        }
    }

第4个:测试“自定义集合”的测试类

   class Program
    {
        static void Main(string[] args)
        {
            PersonCollection pc = new PersonCollection();
            pc.Add(new Person("张三",10));
            pc.Add(new Person("李四",20));
            pc.Add(new Person("王五",25));

            //本质foreach 就是调用接口中的一个方法
            foreach (Person item in pc)
            {
                Console.WriteLine(item.Name+"  "+item.Age);
            }
            //使用自定义的“索引器”访问。
            Console.WriteLine("-----使用索引器访问------");
            Console.WriteLine(pc[0].Name);
            Console.WriteLine(pc[0].Age);
            Console.WriteLine(pc[1].Name);
            Console.WriteLine(pc[1].Age);
            Console.WriteLine(pc[2].Name);
            Console.WriteLine(pc[2].Age);
            Console.ReadLine();
        }
    }

   读者可以通过拷贝以上代码,建立测试用例。通过Program 类测试我们发现,我们自己定义的PersonCollection.cs 类,是可以与ArrayList集合类似,使用foreach 做迭代输出,使用“索引器”来对集合中数据作直接访问。

   我们自定义的“迭代器”类(MyGetEnumberater),其实就是foreach 的内部原理:

   foreach(Person p in PC){}

    等价于如下:
    IEnumberable eab=PC as IEnumerable;     //可迭代接口
    IEnumberator etor=eab.GetEnumerator(); //迭代接口
    while(etor.MoveNext())
    {
         Person p=etor.Current;
         //........
    }

   好了,本节关于C#“自定义集合“知识点,就介绍到这里,大家如果有问题,可以随时留言讨论。谢谢!

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


文章名称:C#自定义集合-创新互联
URL分享:http://cdxtjz.cn/article/dphcdd.html

其他资讯