多列集合的索引器实现

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

下面的代码只是利用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]);
        }
posted @ 2013-03-17 14:37  陈哈哈  阅读(501)  评论(0编辑  收藏  举报