所谓,程序=数据结构+算法。

我目前的日常工作就是繁琐的业务流程和增删改查之类的。

其实繁琐的业务流程也不过是改变一下数据的状态。怪不得叫,面向数据库编程。哈哈。

所以呢,了解一下各种 .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# 集合类-接口的更多相关文章

  1. 牛客网Java刷题知识点之Java集合类里面最基本的接口有哪些

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21086&query=&asc= ...

  2. java集合类框架的基本接口有哪些

    集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以以他自己的方式对元素进行保存和排序.有的集合允许重复的键,有些不允许. java集合类里面最基本 的接口: Collection ...

  3. 八、java集合类

    与数组的区别: 数组的长度是固定的,集合的长度是可变的.数组用来存放基本类型的数据,集合用来存放对象的引用. 1.集合类接口的常用方法 COllection接口是层次结构中的根接口,该接口提供了添加和 ...

  4. java 集合类基础问题汇总

     1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许 ...

  5. Java进阶篇(三)——Java集合类

    集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放.Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对 ...

  6. Java接口和抽象类详解

    父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...

  7. Java面试基础概念总结

    面向对象软件开发的优点有哪些? 答:开发模块化,更易维护和修改:代码之间可以复用:增强代码的可靠性.灵活性和可理解性. 多态的定义? 答:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力. ...

  8. java面试知识(来自牛客网)

    接口和抽象类的区别是什么? 接口和抽象类的区别是什么? Java提供和支持创建抽象类和接口.它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的.而抽象类则可以同时包含抽象和非抽象的方法. ...

  9. Java面试题总结(一)

    Java面试总结 面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和 ...

随机推荐

  1. php Only variables should be passed by reference 报错问题

    这个错误是变量引用引起的非致命错误,可修改php.ini文件的error_reporting = E_ALL & E_NOTICE 使其屏蔽此错误

  2. c++ static静态

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  3. 工具推荐:ATSCAN,功能强大的Perl脚本扫描器

    工具推荐:ATSCAN,功能强大的Perl脚本扫描器 使用perl语言编写的开源的扫描器,功能丰富强大,除了基本的tcp和udp端口扫描之外,还可以搜索wordpress.joomla等网站并进行口令 ...

  4. 已知可生成0~4的rand5(),实现生成0~6的rand7()

    若已知生成0~6的rand7(),求生成0~4的rand5(),则一个方法就是不断生成0~7的数,直到这个数满足0~4就返回. int rand5(){ int res; do{ res = rand ...

  5. CentOS配置163yum源

    1.下载repo文件 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo 2.备份并替换系统的repo文件 [root@localhost ...

  6. Git 创建仓库【转】

    转自:http://www.runoob.com/git/git-create-repository.html Git 创建仓库 本章节我们将为大家介绍如何创建一个 Git 仓库. 你可以使用一个已经 ...

  7. 01 Go 1.1 Release Notes

    Go 1.1 Release Notes Introduction to Go 1.1 Changes to the language Integer division by zero Surroga ...

  8. python网络编程--RabbitMQ

    一:RabbitMQ介绍 RabbitMQ是AMPQ(高级消息协议队列)的标准实现.也就是说是一种消息队列. 二:RabbitMQ和线程进程queue区别 线程queue:不能跨进程,只能用于多个线程 ...

  9. CF401D 【Roman and Numbers】

    题意将n(n<=10^18)的各位数字重新排列(不允许有前导零)  求  可以构造几个mod m等于0的数字解法状压f[S][k] 表示选用的位数集合为S,mod m 为k的方案数注意不能有前导 ...

  10. SQLServer 查看备份进度

    SELECT   DB_NAME(er.[database_id]) [DatabaseName],  er.[command] AS [CommandType],  er.[percent_comp ...