zoukankan      html  css  js  c++  java
  • 多列集合的索引器实现

    单列索引器的实现,在上一篇博文中已经谈到。本文将主要探讨多列集合的索引器的实现方式。

    下面的代码只是利用System.Data下的DataSet来展示多列集合的索引的效果

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    
    namespace BangWorks.PractcalPattern.Concept.Inder
    {
        public class MultiColumnCollectionTest
        {
            private static DataSet _Data=new DataSet();
    
            public DataSet Data
            {
                get { return _Data; }
              //  set { _Data = value; }
            }
            public MultiColumnCollectionTest()
            {
                _Data.Tables.Add("DataTable");
                _Data.Tables[0].Columns.Add("Name");
                _Data.Tables[0].Columns.Add("Age");
                _Data.Tables[0].Rows.Add(new string[] { "ChenZheRong", "23" });
                _Data.Tables[0].Rows.Add(new string[] { "JiangShaoHua", "23" });
            }        
        }
    }

    通过查看定义,我们知道了_Data.Tables所属的DataTableCollection类,其实是一个实现了索引器的类他拥有Columns这个属性

    DataTableCollection类定义

    Columns字段所属的DataColumnCollection类的定义。借助最上方的多列集合的索引的效果代码,我们知道,这个DataColumnCollection类同样实现了索引器。

    DataColumnCollection类定义

    所以,我们得出一个结论:想要实现多列集合多重索引器的效果,只要递归地在实现了索引器的类的属性或字段中,再次实现索引器即可。

    我承认挺拗口的,下面上一段代码说明。

    补充说明:为了方便演示,我们在每个类的构造函数里面自动为他们自身的字段赋一个初值,以便演示。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace BangWorks.PractcalPattern.Concept.Inder
    {
        public class PeopleColumns
        {
            //找出具有相同名称的人
            public NameColumns[] this[String strIndex]
            {
                get
                {
                    return Array.FindAll<NameColumns>(_Name, delegate(NameColumns NameRow)
                        {
                            return NameRow.Name.StartsWith(strIndex);
                        }
                    );
                }//返回子索引器
            }
            private NameColumns[] _Name;
            public PeopleColumns()
            {
                _Name = new NameColumns[] { new NameColumns("XiaoMing"), new NameColumns("XiaoMing"), new NameColumns("XiaoDong"), new NameColumns("LiSan") };
            }
            /// <summary>
            /// 姓名索引器
            /// </summary>
            public class NameColumns
            {
                public NameColumns(string Name)
                {
                    this.Name = Name;
                }
                public string Name;//为了区别子索引器,我们增加一个名称属性,以便突出演示的效果
    
                public GenderColumns this[int index]
                {
                    get { return Sexs[index]; }
                }
                public GenderColumns[] Sexs = new GenderColumns[] { new GenderColumns("Man"), new GenderColumns("Female") };
                /// <summary>
                /// 性别索引器
                /// </summary>
                public class GenderColumns
                {
                    private string Gender;
    
                    public GenderColumns(string Gender)
                    {
                        this.Gender = Gender;
                        Ages = new string[] { Gender + "1", Gender + "2", Gender + "3" };//这里加上性别的前缀,以便区分年龄
                    }
                    public string[] Ages;
                    public object this[int index]
                    {
                        get { return Ages[index]; }
                    }
                }
    
            }
        }
    }

    单元测试

    [TestMethod()]
            public void ItemTest()
            {
                PeopleColumns target = new PeopleColumns(); // TODO: 初始化为适当的值
                  string strIndex = "Xiao"; // 获取姓名字符串开头为Xiao的人
                  PeopleColumns.NameColumns[] actual;
                actual = target[strIndex];
                Assert.AreEqual<int>(3, actual.Length);//3个符合
                  string[] actualAge = actual[0].Sexs[1].Ages;
                Assert.AreEqual<int>(3, actualAge.Length);//3个符合
                  Assert.AreEqual<string>("Female1", actualAge[0]);
            }
  • 相关阅读:
    pacx & zr(yet)
    FileInputStream RandomAccessFile FileChannel 与 MappedByteBuffer (yet)
    结合自定义注解的 spring 动态注入
    redis事务与管道区别
    jdk动态代理与cglib优势劣势以及jdk动态代理为什么要interface
    maven scope属性值设置含义
    xc (yet)
    单链表 环
    适配器模式,将老接口的数据给新接口用
    移动硬盘无法拷贝大于4G的文件
  • 原文地址:https://www.cnblogs.com/kissazi2/p/2964478.html
Copyright © 2011-2022 走看看