同时具备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. 从C#到TypeScript - 类

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...

  2. block之---循环引用

    block内部引用外界对象的原则:block会对他内部所有的强指针进行强引用. 验证原理: 在主控制器中modal出ModalVC控制器,ModalVC中有强引用的block属性,在block内部使用 ...

  3. 移动端touch实现下拉刷新

    移动端实现下拉刷新 第一部分:四个touch事件 1.touchstart:只要将手指放在了屏幕上(而不管是几只),都会触发touchstart事件. 2.touchmove: 当我们用手指在屏幕上滑 ...

  4. css中书写小三角

    我们在开发过程中,有很多的方向标签不是图片,而是用css方法书写上去的. 首先我们要了解原理,border的边框的脚步是45度角. 向左方向: width:0px: height:0px: borde ...

  5. Jsp注册界面——request对象

    1. Reg.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  6. ABP Zero 多租户管理

    ABPZero - 多租户管理 启用多租户 ASP.NET Boilerplate和module-zero可以运行多租户或单租户模式.多租户默认为禁用.我们可以在我们的模块PreInitialize方 ...

  7. ASP.NET MVC4.0+ WebAPI+EasyUI+KnockOutJS快速开发框架 通用权限管理系统

    1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性高.有利软件 ...

  8. 性能测试工具 - Apache JMeter (安装)

    简介 Apache JMeter 是100%纯java语言开发的负载测试和性能测试开源工具. 功能 Apache JMeter可以对静态/动态资源进行性能测试,模拟多个用户并行请求资源端,以测试其强度 ...

  9. MES设备支持快速完工

    1) 在菜单界面点击指定快速键 2) 初始界面 3) 一般流程 a) 扫描任务单号,即可完成工序加工 a1) 获取任务单工序的条件 按任务单卡号或配模的模具卡号搜索行状态为O的工序 a2) 工序完工操 ...

  10. apicloud上传图片

    //定义api $("#photo").change(function(){ //获取图片 api.getPicture({ sourceType: 'library', enco ...