同时具备IList和IDictionary的特点的集合

     [Serializable]
public class MyCollection:IList
{
private readonly Dictionary<string, MyItem> _dicMyItems;
private readonly List<MyItem> _myList;
//private readonly MyUIList _parent; public MyCollection() : this(null)
{ } public MyCollection(MyUIList parent)
{
//_parent = parent;
_myList = new List<MyItem>();
_dicMyItems = new Dictionary<string, MyItem>(StringComparer.InvariantCultureIgnoreCase);
} public MyItem this[string key]
{
get
{
MyItem item;
_dicMyItems.TryGetValue(key, out item);
if (item != null && item.Name == null)
{
return null;
}
return item;
}
} public IEnumerator GetEnumerator()
{
return _myList.GetEnumerator();
} public void CopyTo(Array array, int index)
{
_myList.CopyTo((MyItem [])array, index);
} public int Count
{
get { return _myList.Count; }
private set {}
} public object SyncRoot { get; private set; }
public bool IsSynchronized { get; private set; }
public int Add(object value)
{
return AddHelper((MyItem)value);
} public bool Contains(object value)
{
return _myList.Contains(Cast(value));
} public void Clear()
{
_myList.Clear();
_dicMyItems.Clear();
} public int IndexOf(object value)
{
return _myList.IndexOf((MyItem)value);
} public void Insert(int index, object value)
{
if (value == null)
{
return;
} MyItem item = Cast(value);
Insert(index, item);
} public void Remove(object value)
{
Remove(Cast(value));
} public void RemoveAt(int index)
{
if (index >= _myList.Count)
return;
Remove(_myList[index]);
} public object this[int index]
{
get { return _myList[index]; }
set { _myList[index] = Cast(value); }
} public bool IsReadOnly { get; private set; }
public bool IsFixedSize { get; private set; } private int AddHelper(MyItem item)
{
if (item == null)
throw new ArgumentNullException("item");
if (string.IsNullOrEmpty(item.Name) || _dicMyItems.ContainsKey(item.Name))
{
throw new Exception("name is null or name already exists");
}
//item.Parent = _parent;
int retVal = _myList.Count;
_myList.Add(item);
AddItemToDictionary(item);
return retVal;
} private void AddItemToDictionary(MyItem item)
{
_dicMyItems.Add(item.Name, item);
} private MyItem Cast(object value)
{
if (value == null)
{
throw new ArgumentNullException("value");
} var item = value as MyItem; if (item == null)
throw new ArgumentException("DriverItem"); return item;
} public void Insert(int index, MyItem item)
{
if (item == null)
throw new ArgumentNullException("item");
if (string.IsNullOrEmpty(item.Name) || _dicMyItems.ContainsKey(item.Name))
{
throw new Exception("name is null or name already exists");
}
//item.Parent = _parent;
_myList.Insert(index, item);
AddItemToDictionary(item);
} public void Remove(MyItem item)
{
_myList.Remove(item);
_dicMyItems.Remove(item.Name);
}
}

MyCollection

其中 MyItem为自己定义的数据结构,可以换成自己的,或者改为通用型的T泛型

如果对你有帮助,请顶一下

作者:紫之荆

出处:http://www.cnblogs.com/zizhijing/

欢迎转载

C# 索引同时含有数字和字符串的集合 同时具备IList和IDictionary的特点的更多相关文章

  1. OC基础12:数字、字符串和集合1

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.有时要将一些数字数据类型的值当做对象来 ...

  2. OC基础13:数字、字符串和集合2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ...

  3. java 字符串 大小写转换 、去掉首末端空格 、根据索引切割字符 、判断是否含有某连续字符串

    1. 字符串转大写: toUpperCase() 字符串转小写: toLowerCase() @Test public void tt(){ String d = "sdgGHJGjghGH ...

  4. sql 判断字符串中是否含有数字和字母

    判断是否含有字母 select PATINDEX('%[A-Za-z]%', ‘ads23432’)=0 (如果存在字母,结果<>1) 判断是否含有数字 PATINDEX('%[0-9]% ...

  5. 上篇:python的基本数据类型以及对应的常用方法(数字、字符串、布尔值)

    为了日后便于查询,本文所涉及到的必记的基本字符串方法如下: "分隔符".join(字符串)    #将字符串的每一个元素按照指定分隔符进行拼接.split("字符串&qu ...

  6. day10,11-Python 基本数据类型介绍之数字与字符串(看看就好)

    数字:int #字符串转换整型 a = "123" print(type(a),a) b = int(a) print(type(b),b) b = b + 1000 print( ...

  7. python_04 基本数据类型、数字、字符串、列表、元组、字典

    基本数据类型 所有的方法(函数)都带括号,且括号内没带等号的参数需传给它一个值,带等号的参数相当于有默认值 1.数字 int 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1 ...

  8. python学习之路-基本数据类型1 变量的概念、数字、字符串

    1 什么是数据类型? 每种编程语言都有自己的数据类型,用于标识计算机可以认识的数据,Python中主要的数据类型为字符串,整数,浮点数,列表,元祖,字典,集合七种主要的数据类型,其中以列表,字典为最主 ...

  9. python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)

    最近在用python中的matplotlib画折线图,遇到了坐标轴 "数字+刻度" 混合显示.标题中文显示.批量处理等诸多问题.通过学习解决了,来记录下.如有错误或不足之处,望请指 ...

随机推荐

  1. vb是如何连接数据库的

    vb是如何连接数据库的         刚开始学习数据库时 ,对数据库很不了解,尤其是模块中的代码.照着抄都有很多错的,每一句到底是什么意思呢,根本不懂.于是我就花费了大量的时间去查每一句代码的具体作 ...

  2. 使用node-inspector调试nodejs程序<nodejs>

    1.npm install -g node-inspector  // -g 导入安装路径到环境变量 一般是c盘下AppData目录下 2.node-inspector & //启动node- ...

  3. 安装第三方包web.py发生的错误

    今天新学到了python的模块方面的内容,我的版本是python2.7.13 想安装第三方包web.py的时候, 命令提示符 输入 pip install web.py 总是提示如下错误 You ar ...

  4. Android系统之灯光系统--通知灯深入分析

    Android通知灯的深入分析 通知的类别 声音 振动 闪灯 APP如何发出通知灯请求 getSystemService(通知服务) 构造notification 类别 其他参数(颜色,onMS,of ...

  5. 《半吊子全栈系列:Boostrap3》

    前言:后端开发做网站 几年前,作为一名纯粹后端Java开发人员,对JS还没开窍,对于页面只停留在<十天学会DIV+CSS>这种程度,但是我又想做网站怎么办? 这时候Boostrap3出现了 ...

  6. Monkey实例测试

    三.Monkey实例测试 Windows下(注:2-4步是为了查看我们可以测试哪些应用程序包,可省略): 1. 通过eclipse启动一个Android的emulator或者2 2. 在命令行中输入: ...

  7. DP 动态规划

    p1269 马棚 题目: 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他 ...

  8. 业务逻辑 : forex & mlm

    业务逻辑 公司通过mlm的制度和顾客进行签约来收取资金,再把资金给第三方公司进行投资,再把所投资的回报给分配给公司和顾客. 公司的资金来自投资者,公司的营销策略来自mlm的制度,由市场人员来创建mlm ...

  9. sql server数据库备份压缩拷贝实例

    --数据库备份压缩拷贝实例:前提要安装RAR压缩软件--声明变量declare @day varchar(10),@dbname varchar(20),@filename varchar(100), ...

  10. 深入理解Node系列-细说Connect(上)

    前言 想必对于广大前后端的同学们,Node 或是用来作为网站服务器的搭建,亦或是用来作为开发脚手架的运用,或是早有套路,亦或是浅尝辄止.从现在开始博主将会不定时的对 Node 系列的产品做分析,其中夹 ...