C# 索引同时含有数字和字符串的集合 同时具备IList和IDictionary的特点
同时具备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泛型
如果对你有帮助,请顶一下
C# 索引同时含有数字和字符串的集合 同时具备IList和IDictionary的特点的更多相关文章
- OC基础12:数字、字符串和集合1
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.有时要将一些数字数据类型的值当做对象来 ...
- OC基础13:数字、字符串和集合2
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ...
- java 字符串 大小写转换 、去掉首末端空格 、根据索引切割字符 、判断是否含有某连续字符串
1. 字符串转大写: toUpperCase() 字符串转小写: toLowerCase() @Test public void tt(){ String d = "sdgGHJGjghGH ...
- sql 判断字符串中是否含有数字和字母
判断是否含有字母 select PATINDEX('%[A-Za-z]%', ‘ads23432’)=0 (如果存在字母,结果<>1) 判断是否含有数字 PATINDEX('%[0-9]% ...
- 上篇:python的基本数据类型以及对应的常用方法(数字、字符串、布尔值)
为了日后便于查询,本文所涉及到的必记的基本字符串方法如下: "分隔符".join(字符串) #将字符串的每一个元素按照指定分隔符进行拼接.split("字符串&qu ...
- day10,11-Python 基本数据类型介绍之数字与字符串(看看就好)
数字:int #字符串转换整型 a = "123" print(type(a),a) b = int(a) print(type(b),b) b = b + 1000 print( ...
- python_04 基本数据类型、数字、字符串、列表、元组、字典
基本数据类型 所有的方法(函数)都带括号,且括号内没带等号的参数需传给它一个值,带等号的参数相当于有默认值 1.数字 int 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1 ...
- python学习之路-基本数据类型1 变量的概念、数字、字符串
1 什么是数据类型? 每种编程语言都有自己的数据类型,用于标识计算机可以认识的数据,Python中主要的数据类型为字符串,整数,浮点数,列表,元祖,字典,集合七种主要的数据类型,其中以列表,字典为最主 ...
- python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)
最近在用python中的matplotlib画折线图,遇到了坐标轴 "数字+刻度" 混合显示.标题中文显示.批量处理等诸多问题.通过学习解决了,来记录下.如有错误或不足之处,望请指 ...
随机推荐
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为 ...
- js 将php生成的time()类型时间戳转化成具体date格式的日期
需求: 将首页显示的int类型的时间转化为date类型的时间格式: QuestionModel获取到question列表数据时,包括question['pub_time'],在显示 ...
- Ansible之 Inventory 资源清单介绍
一.Inventory 库存清单文件 1.Inventory 作用 Ansible 可以在同一时间针对多个系统设施进行管理工作.它通过选择Ansible 资源清单文件中列出的系统,该清单文件默认是在/ ...
- iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
一.概要 平时项目开发中,可能使用第三方提供的静态库.a,如果.a提供方技术不成熟,使用的时候就会出现问题,例如: 在真机上编译报错:No architectures to compile for ( ...
- MINIDVD
import java.util.*; public class MiniDVD { public static void main(String[] args){ //扫描器 Scanner inp ...
- JAVA集合一之集合简介(Collection,List,Set)
在编写JAVA程序中,我们经常会遇到需要保存一组数据对象,此时,我们可以采用对象数组来进行多个对象的保存,但对象数组存在一个最大的问题即在于长度上的限制,如果说我们现在要保存一组对象,但是我们并知道数 ...
- Ant学习总结2
<?xml version="1.0" encoding="UTF-8"?> <project default= "compile& ...
- dev简单实现柱状图,曲线图
1.数据源代码: DataTable dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B" ...
- pod install 报错
更新pod出现如下警告 The `SmartCloud_TS [Debug]` target overrides the `GCC_PREPROCESSOR_DEFINITIONS` build se ...
- MobileOA第一期总结
MobileOA第一期总结 前段时间一直没有更新博客,好想给自己找个借口---恩,我还是多找几个吧.毕业论文.毕业照,再感伤一下,出去玩一下,不知不觉就过去几个月了.然后上个月底才重新回到学习之路,从 ...