C#集合命名空间、接口及类型

一、C#集合的命名空间

1.System.Collections                            //非泛型集合

2.System.Collections.Generic               //泛型集合

3.System.Collections.Specialized         //特定集合

4.System.Collections.Concurrent         //支持并发的线程安全集合

5.System.Collections.ObjectModel      //可观察的集合,该命名空间下的ObservableCollection集合类专用于WPF,

                                                                其特性是集合属性发生变化时可将变更通知到UI以便及时刷新UI.

 

二、常见集合接口表


C#常见集合接口
 
接口
 
用途

非泛型接口

IEnumerator
   

IEnumerable
   

ICollection
   

IDictionary
   

IList
   

泛型接口

IEqualityComparer<T>
 
相等性比较

IComparer<T>
 
排序

IEnumerator<T>
 
枚举器接口,用于遍历集合元素(实现该接口将能够享受foreach语法糖)。

IColletion<T>
  提供获取集合基本属性和操作的方法,包括

元素个数、

清空集合、

添加元素、

删除元素、

元素包含检验、

集合范围复制


IList<T>
  获取或移除指定位置元素(索引访问方式)、

在指定位置插入元素

计算指定元素位置


IDictionary<TKey,TValue>
 
访问键和值的接口

ISet
 
集合的布尔操作接口,包括集合的并、交、差、(真)子集和(真)超集检验等

IProducerConsumerCollection<T>
 
支持线程安全的接口(.NET 4增加)

 

 

三、常见集合表

C#常见集合表(注意:n/a为not applicatable,表示该操作不能应用于该类型集合)


分类

集合名称

元素访问方式

增加

插入

删除

排序

检索

特点

非关联性集合
List<T>

(列表)


Index

如果集合必须重置大小,就是O(1)或O(n)

O(n)

O(n)

O(n,logn),最坏情况是O(n^2)
  ①当重置集合大小时将会增加时间复杂度

②功能齐全方便,适用于小型集合

LinkedList<T>

(双向链表)


只能选择从头或尾部按照前后关系遍历访问

O(1)

O(1)

O(1)

n/a

n/a
①访问效率低下,必须从头尾遍历

②元素的添加和删除非常高效

Queue<T>

(队列)


只能获取底部元素
如果集合必须重置大小,就是O(1)或O(n)


n/a

O(1)

n/a

n/a

FIFO
Stack<T>

(栈)


只能获取顶部元素

n/a

O(1)

n/a

n/a

FILO

HashSet

只能通过IEnumerator遍历访问

O(1)或O(n)

O(1)

n/a

n/a
①均实现ISet接口,ISet接口表示集,所谓集为不含重复元素的集合,因此可保证元素的唯一性

支持集合运算(并、交、差、(真)子集、(真)超集关系运算)


SortedSet

O(1)或O(n)

O(1)

n/a

n/a

关联性集合

Dictionaty<TKey,TValue>

Key

O(1)或O(n)

n/a

O(1)

n/a

n/a

排序、检索性能取决于TKey实现的GetHashCode方法

SortedDictionary<TKey,TValue>

Key

O(logN)

n/a

O(logN)

n/a

n/a
 

SortedList<TKey,TValue>

Key
无序数据为O(n);

如果必须重置大小就是O(n);

到列表尾部就是O(logN)


n/a

O(n)

n/a

n/a
 

Lookup<TKey,TValue>

Key
          一键多值

②无构造函数,仅能通过静态扩展方法ToLookup创建


位数组

BitArray

Index
         
可基于int数组A创建位数组B,A中的每一个数字将转换为32位二进制形式,并将每一bit位值转换为true/false,最终B中的值只有true/false两种取值

BitVector32
            ①最多32位的位数组

②值类型,性能比BitArray高


并发集合

ConcurrentQueue
             

ConcurrentStack
             

ConcurrentBag
             

ConcurrentDictionnary
             

BlockingCollection
             
时间: 2024-11-05 13:34:34

C#集合命名空间、接口及类型的相关文章

C#高级编程四十七天----集合接口和类型

集合接口和类型 前面介绍了数组和Array类实现的接口.数组的大小是固定的.如果元素个数是动态的,就应私用集合类. List<T>是与数组相当的集合类.还有其他类型的集合:队列,栈,链表和字典. 大多数集合类都可在System.Collections和System.Collections.Generic名称空间中找到.泛型集合类位于System.Collections.Generic名称空间中;专用于特定类型的集合类位于System.Collections.Specialized名称空间中.线

C#编程(四十七)----------集合接口和类型

原文链接: http://blog.csdn.net/shanyongxu/article/details/47005979 集合接口和类型 前面介绍了数组和Array类实现的接口.数组的大小是固定的.如果元素个数是动态的,就应私用集合类. List<T>是与数组相当的集合类.还有其他类型的集合:队列,栈,链表和字典. 大多数集合类都可在System.Collections和System.Collections.Generic名称空间中找到.泛型集合类位于System.Collections.

asp.net 自定义的模板方法接口通用类型

本来想写这个帖子已经很久了,但是公司事情多,做着做着就忘记了.公司因为需要做接口,而且用的还是asp.net的老框架,使用Handler来做,没得办法,自己照着MVC写了一个通过的接口操作模板. 上送json数据,返回的也是json数据.可以像MVC一样自动绑定并可以进行DataAnnotations验证.尽量达到在业务逻辑处理区域不用对上送参数做过多的获取和判断,能一次搞定就一次搞定. 话不多说,上代码!!! BaseClass:用作接口参数的基类.接口参数类型可以继承该类,也可以不继承,或自

接口——嵌套,接口和类型间的转换,空接口类型,类型分支

1.嵌套 在 Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口间也可以通过嵌套创造出新的接口. 一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样.只要接口的所有方法被实现,则这个接口中的所有嵌套接口的方法均可以被调用. 2.接口和类型间的转换 Go语言中使用接口断言(type assertions)将接口转换成另外一个接口,也可以将接口转换为另外的类型. 1)类型断言的格式 类型断言是一个使用在接口值上的操作.语法上它看起来像 i.(T) 被称为断

JavaScript函数命名空间、参数类型重载实现

有时候使用doFunc({arg1: xxx, arg2:xxx});不方便,还是得在参数表重载,而重载情况又多种多样弄得晕头转向,结果就试着写了这么个东西,也不知道有没有地方能用上: <!DOCTYPE html> <html lang="zh"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

java集合Collection接口

collection集合 Map集合 Collection接口 Collection接口是List.Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集Collection提供了大量添加.删除.访问的方法来访问集合元素.主要的方法如下:

从头认识java-12.6 接口与类型信息(怎么绕过接口直接调用类的所有方法)

这一章节我们来讨论一下接口与类型信息. 在之前的章节里面我们提到接口,父类引用子类对象,然后把方法给缩窄了,但是我们这一章节学习到反射,这个约束就变得没有那么严格. 我们来看看下面的例子: package com.ray.ch11; public class Test { public static void main(String[] args) { Person man = new Man(); man.sleep(); man.run(); // man.say();//error } }

在命名空间下定义类型

如果定义的类型要用于其他.NET 语言,应该把它们放在命名空间下,而不是模块中.这是因为模块在被编译成 C# 或其他.NET 语言时,被处理成类,在模块中定义的任何类型都成为这个类型内部的类.虽然对于 C# 来说,这并不是什么大问题,但是,如果用命名空间代替模块,C# 客户端代码看起来会更清晰.这是因为在 C# 中,只用using 语句导入(open)命名空间,而如果是在模块中的类型,在 C# 中使用时,就必须把模块名作为前缀. 让我们看一下这样的例子.下面的例子定义了类TheClass,它是在

Java集合Map接口与Map.Entry学习

Java集合Map接口与Map.Entry学习 Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs).该接口描述了从不重复的键到值的映射. (1) 添加.删除操作: Object put(Object key, Object value): 将互相关联的一个关键字与一个值放入该映像.如果该关键字已经存在,那么与此关键字相关的新值将取代旧值.方法返回关键字的旧值,如果关键字原先并不存在,则返回null Object remove(Object

未能在全局命名空间中找到类型或命名空间名称“Wuqi”

下载了AspNetPager控件用以进行分页操作,在项目中放入控件后,运行报错:未能在全局命名空间中找到类型或命名空间名称“Wuqi” . 解决办法:在项目下拉框“引用“中添加AspNetPager引用即可 未能在全局命名空间中找到类型或命名空间名称"Wuqi"