同时具备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. uml系列(五)——对象图和包图

    对象图,对象图是系统在某一时刻的对像.关系和属性值的快照.相当于看电视的时候的暂停.便于说明设计者的意图,模拟系统的运行状态,分析说明源代码. 再说对象图之前,我们首先需要了解对象是什么.我们一直都再 ...

  2. 通过 Chrome 在 Windows 中调试运行在 iphone-safari 上的 页面

    本文重点讨论如何在 Windows 系统中通过chrome 浏览器调试运行在 iPhone Safari 浏览器中的网页.如果你有一台 iMac/MacBook,可忽略该文档.iMac 环境下,直接通 ...

  3. js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时

    js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时 >>>>>>>>>&g ...

  4. SpringMVC总结的部分教程及使用方法

    注:本文只用注解来实现 SpringMVC各种流程图流程图(其他的各种流程图)jsp.xml.action彼此之间的关系,都如何使用spring-mvc.xml如何配置,放在哪里?action中如何转 ...

  5. Mybatis实战之TypeHandler高级进阶

    上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型.文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举TypeHandler. 随着项目枚举类型的增多 ...

  6. Weinre 远程调试移动端页面

    Weinre 是一款远程调试工具,使用JS编写, 可以让我们在电脑上直接调试运行在手机上的远程页面,当你的代码已经发布上线,这时候出现了问题,Weinre就可以帮你调试. 调试场景 调试页面在手机上. ...

  7. OSS最新进度汇报(2.25)

    OSS系列最新进度情况如下:一. OSS.Social进度 1. 客服接口升级至新客服接口 2. BaseRecMsg中RecMsg字符串类型修改为xml类型 3. 添加Redis缓存注册实现,代码见 ...

  8. iOS异步处理

    有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现. 同样在,在ios移动开发和Android基本是很类似的一 ...

  9. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  10. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...