C# (江湖小新)- 集合(实际开发使用频率最高的)
什么是集合?
-
集合(Collection)类是专门用于数据存储和检索的类。
-
这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。
-
大多数集合类实现了相同的接口
-
数组的不足之处在于,使用数组管理数据时,需要预先知道数组长度。而实际开发中,很多数据往往是无法事先知道元素个数的
-
集合则解决了这个元素无法动态扩充的问题,集合相当于是数组的升级版,实际开发中也常用它
集合的分类
-
可以分为非泛型集合和泛型集合,二者均间接实现了IEnumerble接口
非泛型集合
-
非泛型集合位于System.Collection命名空间,它可以存储多种类型的对象
-
ArrayList:像一个杂货铺,可以容纳不同类型的对象,像是:int、string、自定义对象等等
-
Hashtable:键值对形式 存储对象的,所谓的键就类似于字典中的目录,值就类似于字典中的具体的信息; 在使用ArrayList的时候,如果我们要从中找某个元素,则需要将此从头到尾循环一遍,一个个进行比对查找,这样效率低下,而用hashtable则不同,可以直接通过key定位到对应的值数据
-
注:其中键是唯一的,不能重复, 重复添加会报错
-
ArrayList 常用方法 使用示例
public static void test1()
{
// 定义一个arrayList集合
ArrayList arrayList = new ArrayList();
//添加元素
arrayList.Add(1);
arrayList.Add(2);
arrayList.Add("a");
arrayList.Add("b");
arrayList.Add(new object());
// 通过角标获取相应值
Console.WriteLine(arrayList[1]); // output: 2
Console.WriteLine(arrayList[3]); // output: b
// 删除元素
arrayList.Remove(2);
//遍历集合,获取元素值
foreach(var i in arrayList)
{
Console.WriteLine(i);
}
//清空集合
arrayList.Clear();
}
输出结果,注前两个结果是 循环之前打印的:
2
b
1
a
b
System.Object
Hashtable 常用方法 使用示例
public static void test2()
{
// 定义一个hashtable集合
Hashtable hashtable = new Hashtable();
//添加元素
hashtable.Add("a", 1);
hashtable.Add("b", 2);
hashtable.Add(1,"aaa");
hashtable.Add(2,"bbb");
// 通过key获取相应的值
Console.WriteLine(hashtable[1]); // output: aaa
Console.WriteLine(hashtable["b"]); // output: 2
// 删除元素
hashtable.Remove(2);
//遍历hashTable集合有三种方式 。
//方式一:遍历其中所有的key,
// 注:此处用var是因为 集合中的元素有多种类型,无法具体指定,实际使用时需要强转
foreach (var k in hashtable.Keys)
{
Console.WriteLine(k);
}
// 方式二:遍历所有values
foreach (var v in hashtable.Values)
{
Console.WriteLine(v);
}
// 方式三:遍历所有的完整内容
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine(entry.Key+":"+entry.Value);
}
//清空集合
hashtable.Clear();
}
输出结果: 前两项结果是循环之前的
aaa
2
a
b
1
1
2
aaa
a:1
b:2
1:aaa
泛型集合
-
List<T>是一种常用的泛型集合,T指某种数据类型,如int,string等,该集合不仅具备ArrayList集合的功能,而且还可以保证List<T>集合只能添加同类型元素,不会出现类型转换的问题
-
Dictionary<K,V>集合是一种键值对集合,在Dictionary<K,V>泛型集合中,需要分别限定键K和值V的类型
-
Set集合:特点是无序、不重复
-
HashSet<T>集合可将HashSet类视为不包含值得Dictionary集合,与List<T>类似
-
SortedSet<T> 在.NET4.0支持,有序无重复的集合
-
List<T> 常用方法与ArrayList基本一致 使用示例
public static void test3()
{
// 定义一个list 集合
List<string> list = new List<string>();
//添加元素
list.Add("a");
list.Add("b");
list.Add("c");
// 通过角标获取相应值
Console.WriteLine(list[0]); //output: a
Console.WriteLine(list[1]); //output: b
// 删除元素
list.Remove("c");
//遍历集合,获取元素值
foreach (string i in list)
{
Console.WriteLine(i);
}
//清空集合
list.Clear();
}
结果输出:
a
b
a
b
Dictionary<K,V> 常用方法与HashTable基本一致 使用示例
public static void test4()
{
// 定义一个字典集合
Dictionary<string,string> dic = new Dictionary<string, string>();
//添加元素
dic.Add("a", "1");
dic.Add("b", "2");
dic.Add("c", "3");
// 通过key获取相应的值
Console.WriteLine(dic["b"]); // output: 2
Console.WriteLine(dic["c"]); // output: 3
// 删除元素
dic.Remove("c");
// 遍历所有的完整内容
foreach (KeyValuePair<string,string> entry in dic)
{
Console.WriteLine(entry.Key + ":" + entry.Value);
}
//清空集合
dic.Clear();
}
结果输出:
2
3
a:1
b:2
HashSet<T>集合,元素自动去重的集合, 使用示例
public static void test5()
{
// 定义一个set集合
HashSet<string> hashSet = new HashSet<string>();
//添加元素
hashSet.Add("a");
hashSet.Add("b");
hashSet.Add("a");
hashSet.Add("b");
hashSet.Add("c");
// 删除元素
hashSet.Remove("c");
//遍历集合,获取元素值
foreach (string i in hashSet)
{
Console.WriteLine(i);
}
//清空集合
hashSet.Clear();
}
结果输出: 可以看出,已经自动去重了
a
b
总结:
-
数组的大小是固定的,而集合的大小是可以动态扩充的
-
在实际开发过程中,推荐使用泛型集合,这样程序看起来更加清晰,同时使用时也不用考虑多种类型转换问题
-
在单线程程序中推荐使用Dictionary,由于具有泛型优势且读取速度较快,其容量利用会更加充分。
-
在多线程程序中推荐使用Hashtable,默认的Hashtable允许单线程写入多线程读取,对Hashtable进一步调用Synchronized()方法可获得完全线程安全的类型。而Dictionary是非线程安全的,必须人为使用lock语句进行保护,其效率大减。
更多**好看的内容**和**好玩的案例**请关注**我的微信公众号: 程序猿知秋**
相关文章
- C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)
- C#将list集合转化为sql
- C# 并发安全集合ConcurrentBag取代List
- C#Redis集合set
- C#使用集合组织相关数据
- 《C#高级编程》学习笔记----c#内存管理--栈VS堆
- 编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]
- 编写高质量代码改善C#程序的157个建议[动态数组、循环遍历、对象集合初始化]
- C# 文件流相关操作
- C# 视频监控系列(14):总结贴——VC++代码转成C#小结
- [c#基础]集合foreach的必要条件和自定义集合
- C# 获取Excel工作薄中Sheet页(工作表)名集合
- C# 获取Excel工作薄中Sheet页(工作表)名集合
- Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
- atitit.提取zip rar文件列表 java php c# 的原理与设计
- C# 多态性
- asp.net(c#)有关 Session 操作的几个误区
- C#集合类:动态数组、队列、栈、哈希表、字典(转)
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- C#开发PACS医学影像处理系统(十二):绘图处理之图形标记
- C# 并发安全集合ConcurrentBag取代List
- C# 线程安全集合
- C#异步编程基础入门总结
- 语法糖----C#的async和await
- c#数组和集合