单列索引器的实现,在上一篇博文中已经谈到。本文将主要探讨多列集合的索引器的实现方式。
下面的代码只是利用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这个属性。
Columns字段所属的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]); }