• 多列集合的索引器实现


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

    下面的代码只是利用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]);
            }
  • 相关阅读:
    laravel 查询指定字段的值
    laravel 连表查询数据库
    jar包在控制台下运行
    jsp 中文乱码
    PHP垃圾回收深入理解
    php在foreach中使用引用赋值&可能遇到的问题
    接口和抽象类有什么区别
    关于php优化 你必须知道的一些事情
    yii 表单小部件
    yii 表单小部件的使用方式
  • 原文地址:https://www.cnblogs.com/kissazi2/p/2964478.html
Copyright © 2020-2023  润新知