C# Collection
数组与集合不同的适用范围:
数组:数组最适用于创建和使用固定数量的强类型化对象。
集合:集合提供更灵活的方式来使用对象组。 与数组不同,你使用的对象组随着应用程序更改的需要动态地放大和缩小。 对于某些集合,你可以为放入集合中的任何对象分配一个密钥,这样你便可以使用该密钥快速检索此对象。
集合的类型
System.Collections.Generic 类
Generic 泛型
| 类 | 说明 | 
|---|---|
| Dictionary | 表示基于键进行组织的键/值对的集合。 | 
| List | 表示可按索引访问的对象的列表。 提供用于对列表进行搜索、排序和修改的方法。 | 
| Queue | 表示对象的先进先出 (FIFO) 集合。 | 
| SortedList | 表示基于相关的 IComparer 实现按键进行排序的键/值对的集合。 | 
| Stack | 表示对象的后进先出 (LIFO) 集合。 | 
System.Collections.Concurrent 类
Concurrent 并发
只要多个线程同时访问集合,就应使用 System.Collections.Concurrent 命名空间中的类。
System.Collections 类
已经过时,尽可能不要用!
只要可能,则应使用 System.Collections.Generic 命名空间或 System.Collections.Concurrent 命名空间中的泛型集合,而不是
System.Collections命名空间中的旧类型。推荐使用泛型版本和并发版本的集合,因为它们的类型安全性很高,并且还经过了其他改进。
选择集合
| 我要…… | 泛型集合选项 | 
|---|---|
| 将项存储为键/值对以通过键进行快速查找 | Dictionary | 
| 按索引访问项 | List | 
| 使用项先进先出 (FIFO) | Queue | 
| 使用数据后进先出 (LIFO) | Stack | 
| 按顺序访问项 | LinkedList | 
| 已排序的集合 | SortedList | 
| 数学函数的一个集 | HashSet SortedSet | 
泛型集合的算法复杂性
Runtime Complexity of .NET Generic Collection
| Internal Implement- ation | Add/insert | Add beyond capacity | Queue/Push | Dequeue/ Pop/Peek | Remove/ RemoveAt | Item[index]/ElementAt(index) | GetEnumerator | Contains(value)/IndexOf/ContainsValue/Find | |
|---|---|---|---|---|---|---|---|---|---|
| List | Array | O(1) to add, O(n) to insert | O(n) | - | - | O(n) | O(1) | O(1) | O(n) | 
| LinkedList | Doubly linked list | O(1), before/after given node | O(1) | O(1) | O(1) | O(1), before/after given node | O(n) | O(1) | O(n) | 
| Stack | Array | O(1) | O(n) | O(1) | O(1) | - | - | O(1) | O(n) | 
| Queue | Array | O(1) | O(n) | O(1) | O(1) | - | - | O(1) | O(n) | 
| Dictionary | Hashtable with links to another array index for collision | O(1), O(n) if collision | O(n) | - | - | O(1), O(n) if collision | O(1), O(n) if collision | O(1) | O(n) | 
| HashSet | Hashtable with links to another array index for collision | O(1), O(n) if collision | O(n) | - | - | O(1), O(n) if collision | O(1), O(n) if collision | O(1) | - | 
| SortedDictionary | Red-black tree | O(log n) | O(log n) | - | - | O(log n) | O(log n) | O(log n) | O(n) | 
| SortedList | Array | O(n), O(log n) if added to end of list | O(n) | - | - | O(n) | O(log n) | O(1) | O(n) | 
| SortedSet | Red-black tree | O(log n) | O(log n) | - | - | O(log n) | O(log n) | O(log n) | - | 
Note:
Dictionary
Add, remove and item[i] has expected O(1) running time
HashSet
Add, remove and item[i] has expected O(1) running time
集合设计分析
常用集合的注意事项
List<T>
删除元素的顺序
使用以降序进行循环访问的 for 语句,而非 foreach 语句。这是因为 RemoveAt 方法将导致已移除的元素后的元素的索引值减小。
待续...
C# Collection的更多相关文章
- Java基础Collection集合
		
1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:
 - Collection集合
		
一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...
 - iOS之解决崩溃Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.
		
崩溃提示:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CAL ...
 - [Java Collection]List分组之简单应用.
		
前言 今天有一个新需求, 是对一个List进行分组, 于是便百度到一些可用的代码以及我们项目使用的一些tools, 在这里总结下方便以后查阅. 一: 需求 现在我们一个数据库表t_series_val ...
 - Java Collection开发技巧
		
Java Collection(集合) 集合中的一些技巧: 通过Collections类的静态方法,可以对集合进行一些操作 1 java.util.List<Integer> number ...
 - 浅谈Collection集合
		
俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对 ...
 - Backbone中的model和collection在做save或者create操作时, 如何选择用POST还是PUT方法 ?
		
Model和Collection和后台的WEB server进行数据同步非常方便, 都只需要在实行里面添加一url就可以了,backbone会在model进行save或者collection进行cre ...
 - Collection和Collections的区别?
		
Collection 是接口(Interface),是集合类的上层接口. Collections是类(Class),集合操作的工具类,服务于Collection框架.它是一个算法类,提供一系列静态方法 ...
 - Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
		
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
 - MyBatis中collection     (一对一,一对多)
		
MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...
 
随机推荐
- CSS样式逐li添加,执行完,清空,反复执行
			
function change_light(el) { el.hide() let i = 0; function temp() { if (i > el.length - 1) { el.hi ...
 - Java流程控制01——用户交互Scanner
			
用户交互Scanner sacnner对象 之前的语法并没有实现程序与人的交互.java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入. 基本语法: S ...
 - C++ 继承方式  //语法:class 子类 :继承方式  父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承
			
1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...
 - 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
			
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
 - JAVA基础语法:java编程规范和常用数据类型(转载)
			
JAVA基础语法:java编程规范和常用数据类型 摘要 本文主要介绍了最基本的java程序规则,和常用数据类型,其中侧重说了数组的一些操作. 面向java编程 java是纯面向对象语言,所有的程序都要 ...
 - Golang语言系列-11-goroutine并发
			
goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...
 - CNVD-2021-14536 锐捷 RG-UAC 统一上网行为管理审计系统信息泄露漏洞
			
漏洞简介 锐捷 RG-UAC 统一上网行为管理审计系统存在信息泄露,攻击者通过网页源代码可间接获取管理用户账号密码,登录管理后台. 漏洞复现 fofa搜索以下关键字 title="RG-UA ...
 - NOIP 模拟 6 模板
			
题目 题解 这道题是一道启发式合并的题目,每次合并完重构一下线段树就可以,不用线段树合并. 以操作时间为下标,建立一颗线段树,维护小球的个数与小球的颜色数,最后线段树上二分查找. 我们先不用考虑每个节 ...
 - leaflet antvPath示例
			
参考:https://www.cnblogs.com/vichang/p/9438870.html leaflet-antvPath官网:https://github.com/rubenspgcava ...
 - ASP net core面试题汇总及答案
			
在dot net core中,我们不需要关心如何释放这些服务, 因为系统会帮我们释放掉.有三种服务的生命周期. 单实例服务, 通过add singleton方法来添加.在注册时即创建服务, 在随后的请 ...