一、ArrayList、List< T >列表和HashSet< T >哈希集

1.简单介绍及区别:

命名空间
System.Collections:ArrayList
System.Collections.Generic:List<T> 、 HashSet<T>

ArrayList:是一个使用大小会根据需要动态增加的数组,可以存储任意类型的数据,但是ArrayList存储的都是Object类型,很多时候在存取时需要强制类型转换,引起装箱和拆箱的操作,可能会影响效率。

List<T>泛型集合列表:用于存储某一种特定类型的数据,存储的数据可以重复,并且存储的数据是有序的,可以通过下标[]获取。用法在一定程度上比ArrayList更灵活、高效,可以说是最常用的一种容器。

HashSet<T>哈希集:与List一样用于存储一种特定类型的数据,区别是存储的数据不可以重复,会自动消除重复,并且其中存储的元素没有特定的顺序,不能通过下标[]访问。

2.List< T >简单用法举例:

辅助类:

 public class People{public string name;public int age;public People(string _name, int _age){name = _name;age = _age;}}

创建:
可以在创建的时候初始化

添加元素:

list.Add(50);//Add默认将数据添加到结尾 结果:list =【10,40,30,20,50】
People[] data = new People[] { new People("小明", 10), new People("小李", 9), new People("小张", 12) };
peoples.AddRange(data);//整体添加

排序、反转:
可以使用lambda表达式自定义特定类型排序方式

list.Sort();//升序  结果:list =【10,20,30,40,50】
list.Reverse();//将列表反转,无排序效果   结果:list =【50,40,30,20,10】
//lambda表达式对People类型排序
peoples.Sort((People a, People b) =>
{return a.age < b.age ? -1 : 1;//-1->a排前,1->a排后
});

查找、删除:

bool con = list.Contains(30);//是否包含,返回bool值
bool removeSuccess = list.Remove(20);//移除特定对象的第一个匹配项,删除成功返回true,否则返回false
list.RemoveAt(2);//删除指定索引处的元素

3.List< T >注意事项:赋值

赋值:赋值不当会造成项目里莫名其妙的数据异常

List<int> oldList = new List<int>() { 10, 20, 30, 40, 50, 60 };//创建一个原始list集合
List<int> newList = oldList;//将创建的原始list集合赋值给另一个新ListnewList.Remove(30);//新list删除30这个元素,此时oldList里的30元素也会被删除,因为oldList和newList指的是同一个集合
foreach(var it in oldList)
{Console.Write(it + "  ");
}Console.WriteLine("-----------------");
foreach (var it in newList)
{Console.Write(it + "  ");
}
Console.ReadKey();

二、Hashtable 哈希表和Dictionary字典

1.简单介绍及区别:

命名空间:
System.Collections:Hashtable
System.Collections.Generic:Dictionary

Hashtable和Dictionary都是从一组键(Key)到一组值(Value)的映射,其中存储的每一个元素都是一组键值对。并且存储的元素具有无序性,其中的每一个Key都必须是唯一且不允许为null,Key值不允许重复,Value在是引用类型的情况下可以为null。区别是Hashtable的键值都是object类型,存取强制转换会引起装箱拆箱操作,但是Dictionary可以自定义键值为什么类型,存取效率会高一写。

2.Dictionary简单用法举例:

创建,添加元素,删除:

Dictionary<int, string> dict = new Dictionary<int, string>();//创建,创建完后长度为0
dict.Add(1, "小张");//添加元素,保持key值唯一
dict.Add(2, "小李");
dict.Add(3, "小王");
dict.Add(4, "小何");
dict.Remove(3);//删除指定key值为3的元素

查找、取值、遍历:

bool contain = dict.ContainsKey(2);//是否包含指定key值的元素
string value = string.Empty;
bool getValue = dict.TryGetValue(2, out value);//获取与指定键关联的值,返回值如果true,则包含具有指定键的元素,值为Value,否则为false。
//遍历
foreach(KeyValuePair<int,string> item in dict)
{Console.WriteLine(item.Key + "  " + item.Value);//打印每个键值对的key和value
}

3.Dictionary注意事项:添加元素,取值,遍历时删除元素

添加元素、取值:

dict [ key ] = value
⇒ 当Dict里key值存在,表示修改value值,当key值不存在,表示添加<key,value>这个元素。
value = dict [ key ]
⇒ 当Dict里key值存在,合法,当key值不存在,不合法,抛异常,所以一般应该尽量避免这种写法。

dict.Add(1, "小张");//添加元素,保持key值唯一
dict.Add(2, "小李");
dict.Add(3, "小王");
dict.Add(4, "小何");
dict[5] = "小马";//当dict里含有5这个key时,这句话表示更改key值为5的value值,当dict里不含有5这个key值时,这句话表示添加<5,小马>这个键值对。
Console.WriteLine(dict[6]);//不合法,抛异常System.Collections.Generic.KeyNotFoundException:“给定关键字不在字典中。”

删除元素:
Dictionary里value值是可以重复的,假如需要删除dict里所有Value是小张的元素
一般情况是遍历删除,但是在遍历执行枚举操作时修改集合,会抛异常。
错误写法:

foreach(var item in dict)//遍历
{if (item.Value == "小张")//删除dict里所有vale值是小张的元素{//抛异常,System.InvalidOperationException:“集合已修改;可能无法执行枚举操作。”dict.Remove(item.Key);}
}

常规正确写法:
先找,保存所有key,再删

List<int> needRemoveKeys = new List<int>();
foreach(var item in dict)//遍历
{if (item.Value == "小张")//找到dict里所有vale值是小张的元素{needRemoveKeys.Add(item.Key);//先保存key值}
}
foreach(var it in needRemoveKeys)//遍历需要删除的key值集合,挨个删除
{dict.Remove(it);
}

三、Stack栈和Queue队列

1.简单介绍:

命名空间:
System.Collections:Stack、Queue
System.Collections.Generic:Stack<T>、Queue<T>

栈:表示对象的简单后进先出 (LIFO) 的集合,Stack为非泛型集合,Stack<T>为泛型集合。先放入栈的数据会被后调取。
队列:表示对象的先进先出(FIFO)集合,Queue为非泛型集合,Queue<T>为泛型集合。先放入队列的数据会被先调取。

2.简单用法举例:

栈:

Stack newStack = new Stack();//创建一个非泛型栈
newStack.Push(30);//在顶部插入一个对象
newStack.Push(20);//
newStack.Push(10);//此时newStack={30,20,10}
IEnumerator enumerator = newStack.GetEnumerator();
while (enumerator.MoveNext())//枚举遍历
{Console.WriteLine(enumerator.Current);
}
int value1 = (int)newStack.Peek();//返回的对象顶部的数据而不删除它,取出后需要强制类型转换,此时newStack={30,20,10}
int value2 = (int)newStack.Pop();//删除并返回顶部的数据,此时newStack={30,20}

队列:

Queue<string> queue = new Queue<string>();//使用泛型队列创建一个存储string类型的队列
queue.Enqueue("小明");//将对象添加到队列的结尾处。
queue.Enqueue("小张");
IEnumerator queueEnumerator = queue.GetEnumerator();
while (queueEnumerator.MoveNext())//枚举遍历
{Console.WriteLine(queueEnumerator.Current);
}
string _value1 = queue.Peek();//返回位于队列开始处的对象但不将其移除。
string _value2 = queue.Dequeue();//移除并返回位于队列开始处的对象

原文链接:https://blog.csdn.net/qq_41468219/article/details/106391733

C#常见容器ArrayList、List、HashSet、Hashtable 、Dictionary、Stack、Queue相关推荐

  1. C++、Java、python中的一些常见容器总结

    主要参考:<数据结构与算法/leetcode/lintcode题解>.C++参考手册.<疯狂Java> 文章目录 <数据结构与算法>学习笔记(一)基础知识-基本数据 ...

  2. hashset hastable dictionary concurrentdictionary区别

    hashset hastable dictionary concurrentdictionary区别 1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framewo ...

  3. Java最佳实践– Vector vs ArrayList vs HashSet

    在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将在三个最常用的Collection实现类之间进行性能比较. 为了使事情变得更现实,我们将在多线程环境下进行测试,以讨论和演示如 ...

  4. java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)

    一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...

  5. Hashtable Dictionary的使用

    要了解C#中Hashtable Dictionary的使用,我们先来看一个例子! using System; using System.Collections; namespace NoSortHas ...

  6. Lession11 集合和泛型(ArrayList方法、Arraylist类、ArrayList添加对象、ArrayList长度、HashTable类、Hashtable类练习-----)

    目录 ArrayList方法: ArrayList添加对象: Arraylist类: ArrayList长度: HashTable类: Hashtable类练习: IComparable泛型接口排序: ...

  7. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  8. Java中如何克隆集合——ArrayList和HashSet深拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...

  9. Java知识点总结(Java容器-ArrayList)

    Java知识点总结(Java容器-ArrayList) @(Java知识点总结)[Java, Java容器, JavaCollection, JavaList] ArrayList 底层实现是数组,访 ...

最新文章

  1. Gartner发布2020年数据与分析领域的十大技术趋势
  2. CloudStack各版本新特性
  3. sftp shell 批量上传文件_shell脚本进行sftp、ftp文件批量上传与下载
  4. 启动celery后执行任务报错:django.core.exceptions.ImproperlyConfigured
  5. matlab识别图像,基于MATLAB神经网络图像识别的高识别率代码
  6. Oracle入门(十三A)之Select
  7. Java内部类的定义和使用
  8. Python之线程(一)
  9. laravel5.5中添加对分页样式的修改上一页和下一页
  10. android 获取service 实例化,在Activity中,如何获取service对象?a.可以通过直接实例化得到。b.可以通过绑定得到。c.通过star - 众答网问答...
  11. mysql alisql,Mysql-03. ubuntu 安装 alisql
  12. excel两个表格数据对比_Excel表格中数据比对和查找的几种技巧
  13. JAVA实现的吸血鬼数字算法,高效率版本(已有网友给出算法说明)
  14. video标签隐藏右下角的三个点
  15. 如何设计一个吸引访问者的网站主页?
  16. 移动机器人定位方法概述
  17. 【重识云原生】第六章容器6.3.5节——Controller Manager概述
  18. 什么蓝牙耳机好用又不贵?好用不贵的蓝牙耳机推荐
  19. Android隐藏和显示输入法
  20. 构建信用卡反欺诈预测模型——机器学习

热门文章

  1. 前端上传图片到七牛云
  2. getWindow().getDecorView().setSystemUiVisibility(...)设置状态栏属性
  3. 如何进行不同容量硬盘对拷
  4. 【Python学习笔记(二)】使用Pyinstaller将不同路径下的py文件打包成exe可执行文件
  5. 【Vue】下载依赖包node_modules 打包项目
  6. 国外流行网上支付方式
  7. abuse file struct 阅读记录
  8. Jim Joseph加入Burson Cohn Wolfe,担任新设立的全球职位
  9. java基础(三) IDEA使用与多线程编程
  10. QImage图像格式解读