C# 集合类-接口
所谓,程序=数据结构+算法。
我目前的日常工作就是繁琐的业务流程和增删改查之类的。
其实繁琐的业务流程也不过是改变一下数据的状态。怪不得叫,面向数据库编程。哈哈。
所以呢,了解一下各种 .net内置的集合类对我来说是有很大帮助的。
这篇大概讲一下集合类的接口。
在 System.Collections, 命名空间下的是关于集合的接口以及系统集合类的一些定义
- public interface ICollection:IEnumerable
- public interface IComparer
- public interface IDictionary:ICollection,IEnumerable
- public interface IDictionaryEnumerator:IEnumerato
- public interface IEnumerable
- public interface IEnumerator
- public interface IEqualityComparer
- public interface IHashCodeProvider
- public interface IList:ICollection,IEnumerable
- internal class KeyValuePairs
- //枚举接口
- public interface IEnumerator
- {
- bool MoveNext();
- object Current{get;}
- void Reset();
- }
这个方法接口里有两个方法,分别是移动到下一个项和复位初使。
还有一个属性,这个属性的返回值是object。
这个移动是单向的,只能一个方向移动,不可以自己选移动的方向和条目。
这个可以认为是集合类必须实现的基本接口。
- //返回枚举接口
- public interface IEnumerable
- {
- IEnumerator GetEnumerator();
- }
在这两个接口的基础上形成其他的接口。
- //有序集合
- public interface ICollection : IEnumerable
- {
- //把集合对象拷贝
- void CopyTo(Arrayarray,intindex);
- //集合的元素数目
- intCount{get;}
- //返回集合是否是多线程同步访问
- boolIsSynchronized{get;}
- //返回同步对象
- objectSyncRoot{get;}
- }
- //索引集合
- public interface IList : ICollection,IEnumerable
- {
- int Add(object value);
- void Clear();
- bool Contains(object value);
- int IndexOf(object value);
- void Insert(int index,object value);
- void Remove(object value);
- void RemoveAt(int index);
- bool IsFixedSize{get;}
- bool IsReadOnly{get;}
- object this[intindex]{get;set;}
- }
这个接口就很丰富了,有增加成员,删除成员等一些方法。
- //字典集合或键值集合
- public interface IDictionary : ICollection,IEnumerable
- {
- void Add(objectkey,objectvalue);
- void Clear();
- bool Contains(object key);
- IDictionaryEnumerator GetEnumerator();
- void Remove(object key);
- bool IsFixedSize{get;}
- bool IsReadOnly{get;}
- object this[object key]{get;set;}
- ICollection Keys{get;}
- ICollection Values{get;}
- }
集合类型都实现了 IEnumerable(返回枚举接口) 接口,从而可以使用 foreach 迭代循环。
实现了 ICollection(有序集合) 接口的集合类表明集合中的元素是有先后顺序的。
IList 接口继承了 ICollection(有序集合) 接口,实现了 IList 接口的集合类不止表明集合中的元素是有先后顺序,而且表明集合类可以通过下标访问的方式来访问集合元素。
IDictionary 接口也继承了 ICollection(有序集合) 接口,实现了 IDicionary 接口的集合类可以通过下标 key 访问的访问方式访问集合元素。
ICollection 接口扩展了 IEnumerable;
IDictionary 和 IList 则是扩展 ICollection 的更为专用的接口。
IDictionary 实现是键/值对的集合,如Hashtable类。
IList 实现是值的集合,其成员可通过索引访问,如 ArrayList 类。
某些集合(如 Queue 类和 Stack 类)限制对其元素的访问,它们直接实现ICollection接口。
如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。
在此 ILIST 接口的基础上产生的一些类型 是我们实际编程中能用的到的,比如
- //数组类这个类是抽象的
- public abstract class Array : ICloneable, IList, ICollection, IEnumerable
我们平时用到的比如 int[] intarray = new int[] {} 是派生于这个抽象类。
但是数组是从 Array 隐式派生的,这是由编译器完成的,所以我们看不到具体的实现过程。
比如
- Array array1;
- int[]a=newint[]{};
- string[]b=newstring[]{};
- array1=a;
- array1=b
因为数组的大小是固定的,类型也是固定的。就发明了 ArrayList,它是一个长度可变的object数组。
- public class ArrayList : IList, ICollection, IEnumerable, ICloneable
object 可以传入任何类型但是涉及装箱和拆箱的操作,所以性能受影响。
Stack和Queue栈和队列是有序集合。
HashTable 实现了 IDictionary 接口。是键值对的集合。
也是键和值都是object但是索引,集合下标是int,value是object
但是hashtable键值不是按照插入的顺序进行排列。
- public class SortedList : IDictionary, ICollection, IEnumerable, ICloneable
SortList 也是字典类,但是按照顺序排放.
非范性的集合类就这些了。
泛型集合类
System.Collections.Generic 是.NET2.0新增的一个命名空间。
C#1.0 中的集合类型都存在着装箱,拆箱的性能问题以及潜在的类型安全问题。
丑陋的设计必须得到改进,于是 C#2.0 就引入了泛型这个概念。
泛型即解决了装箱拆箱的性能问题,又解决了潜在的类型转换安全问题,所以在实际应用中,推荐使用泛型集合代替非泛型集合。(泛型实际是编译器帮我们生成了代码)
- //这个泛型接口继承自非泛型的同名接口
- public interface IEnumerator<T> : IDisposable , IEnumerator
- {
- bool MoveNext();
- T Current { get; }
- void Reset();
- }
- //返回枚举 泛型的同名接口
- public interface IEnumerable<T> : IEnumerable//
- {
- IEnumerator<T> GetEnumerator();
- }
IEnumerable 只有一个方法 GetEnumerator() 即得到遍历器。
- //有序集合
- public interface ICollection<T> : IEnumerable<T>,IEnumerable
- {
- void Add(Titem);
- void Clear();
- bool Contains(Titem);
- void CopyTo(T[]array,intarrayIndex);
- bool Remove(Titem);
- int Count{get;}
- bool IsReadOnly{get;}
- }
ICollection 与 ICollection<T> 略有不同,
ICollection 不提供编辑集合的功能,即 Add() 和 Remove()。包括检查元素是否存在的 Contains 也不支持。
- public interface IDictionary<TKey,TValue> : ICollection<KeyValuePair<TKey,TValue>>,IEnumerable<KeyValuePair<TKey,TValue>>,IEnumerable
- {
- void Add(TKeykey,TValuevalue);
- bool ContainsKey(TKeykey);
- bool Remove(TKeykey);
- bool TryGetValue(TKeykey,outTValuevalue);
- TValue this[TKeykey]{get;set;}
- ICollection<TKey> Keys{get;}
- ICollection<TValue> Values{get;}
- }
- public interface IList<T> : ICollection<T>,IEnumerable<T>,IEnumerable
- {
- int IndexOf(Titem);
- void Insert(intindex,Titem);
- void RemoveAt(intindex);
- T this[intindex]{get;set;}
- }
IList 是直接继承自 ICollection 和 IEnumerable。
所以它包括两者的功能,并且支持根据下标访问和添加元素。IndexOf, Insert, RemoveAt等等。
可以说,IEnumerable 支持的功能最少,只有遍历。而 ICollection 支持的功能稍微多一点,不仅有遍历还有维护这个集合的功能。而 IList 是最全的版本。
- public class List<T> : IList<T>,ICollection<T>,IEnumerable<T>,IList,ICollection,IEnumerable
- public class Dictionary<TKey,TValue>:IDictionary<TKey,TValue>,ICollection<KeyValuePair<TKey,TValue>>,IEnumerable<KeyValuePair<TKey,TValue>>,IDictionary,ICollection,IEnumerable
泛型 list 和泛型 Dictionary 都是继承自泛型 ICollection
IReadOnlyList<T>
这个是在 Framework4.5 中新增的接口类型。可以被看作是IList<T>的缩减版,去掉了所有可能更改这个集合的功能。比如:Add, RemoveAt 等等。
泛型集合与非泛型集合的对应
ArrayList => List<T>
Stack,Queue => Stack<T>,Queue<T>
HashTable => Dictionary<TKey,TValue>
SortedList => SortedList<TKey,TValue> / SortedDictionary<TKey,TValue>
参考:http://www.cnblogs.com/C-CHERS/p/5809087.html
C# 集合类-接口的更多相关文章
- 牛客网Java刷题知识点之Java集合类里面最基本的接口有哪些
不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21086&query=&asc= ...
- java集合类框架的基本接口有哪些
集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以以他自己的方式对元素进行保存和排序.有的集合允许重复的键,有些不允许. java集合类里面最基本 的接口: Collection ...
- 八、java集合类
与数组的区别: 数组的长度是固定的,集合的长度是可变的.数组用来存放基本类型的数据,集合用来存放对象的引用. 1.集合类接口的常用方法 COllection接口是层次结构中的根接口,该接口提供了添加和 ...
- java 集合类基础问题汇总
1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许 ...
- Java进阶篇(三)——Java集合类
集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放.Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对 ...
- Java接口和抽象类详解
父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...
- Java面试基础概念总结
面向对象软件开发的优点有哪些? 答:开发模块化,更易维护和修改:代码之间可以复用:增强代码的可靠性.灵活性和可理解性. 多态的定义? 答:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力. ...
- java面试知识(来自牛客网)
接口和抽象类的区别是什么? 接口和抽象类的区别是什么? Java提供和支持创建抽象类和接口.它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的.而抽象类则可以同时包含抽象和非抽象的方法. ...
- Java面试题总结(一)
Java面试总结 面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和 ...
随机推荐
- Informatica学习:2、配置存储库服务和集成服务
继续上一篇的1.安装介质的获取与安装,本文介绍服务端的存储库服务和集成服务的配置. 安装好Informatica的客户端和服务端后,需要登陆Administration Console,配置存储库服务 ...
- 支付宝hr终面,忐忑的等待结果
上周一,内推网投了支付宝上海的 高级java软件开发工程师:阿里效率就是高,不到30分钟电话就过来了!约的上周五14:00面试:上周五技术面了2轮,第一轮是主管面试,貌似给了p6;第二轮部门总监面试, ...
- 通过PDB文件实现非嵌入式的c++反射
上一篇blog我阐述了一种实现非嵌入式的反射的基本思路.相比于通过宏和模板实现,这种非嵌入的反射的优点是不需要写额外的代码来记录meta信息. 首先,为了在c++中实现反射系统,我认为需要解决以下两个 ...
- nginx自定义500,502,504错误页面无法跳转【转】
1.自定一个页面,这个页面是一个链接地址可以直接访问的. 以下是nginx的配置: location / { proxy_pass http://tomcat_app108; ...
- jQuery插件之ajaxFileUpload(异步上传图片并实时显示,并解决onchange后ajaxFileUpload失效问题)
参考学习: 第一篇:http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 第二篇:http://www.jb51.net/a ...
- jQuery-对标签的样式操作
一.操作样式类 // 1.给标签添加样式类 $("选择器").addClass("类名") // 2.移除标签的样式类 $("选择器").r ...
- Ubuntu_搜狗输入法安装
前言 由于很少使用Linux系统,所以闲下来打算看一看,在安装完成后,遇到无法输入中文的问题.我使用的是小鹤双拼,所以习惯使用搜狗输入法,本文记录一下如何在ubuntu系统下安装小鹤双拼 由于前两次并 ...
- ASP防XSS代码
原作是在GitHub上,基于Node.js所写.但是..ASP的JS引擎跟V8又有些不同..于是,嗯.. <% Function AntiXSS_VbsTrim(s) AntiXSS_VbsTr ...
- wpf设置某容器透明,而不应用到容器的子元素的方法
以Border打比方: <Border.Background> <SolidColorBrush Opacity="0.4" Color="Black& ...
- 利用CE手动破解百度云下载限速!
一步,你需要打开百度云<ignore_js_op> 第二步,你需要用上面附送的工具选择百度云进程<ignore_js_op> 第三点,不多说,看图<ignore_js_o ...