多列集合的索引器实现

简介:

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

下面的代码只是利用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]);
        }
复制代码


作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/archive/2013/03/17/2964478.html

目录
相关文章
|
9月前
集合、哈希表、字典
集合、哈希表、字典
48 0
|
5月前
|
C#
c#集合去重&排序常用方法
list和数组转Hashset跟SortedSet进行排序和去重,以及当Hashset和SortedSet存放的是类时如何进行自定义的排序和去重
46 2
|
6月前
|
Python
python之集合的创建与使用,遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套
python之集合的创建与使用,遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套
|
7月前
|
数据库
单列全部使用RepositoryCheckEdit
单列全部使用RepositoryCheckEdit
|
8月前
|
存储 Java
2.2 Lambda表达式在集合操作中的应用:过滤和筛选集合元素
2.2 Lambda表达式在集合操作中的应用:过滤和筛选集合元素
456 0
|
8月前
|
Java
2.3 Lambda表达式在集合操作中的应用:对集合元素进行映射和转换
2.3 Lambda表达式在集合操作中的应用:对集合元素进行映射和转换
88 0
|
9月前
根据数组中对象的属性值进行排序
根据数组中对象的属性值进行排序
64 0
|
10月前
|
索引
避免在索引列上使用内置函数
避免在索引列上使用内置函数
|
11月前
|
存储 索引 Python
列表、字典、集合、元组
列表、字典、集合、元组
46 0
|
存储 SQL 关系型数据库
MySql索引详解-各种索引的定义与区别和应用
什么是索引?索引的作用,有无索引的区别。
152 0
MySql索引详解-各种索引的定义与区别和应用