C#中的集合ArrayList、List、Hashtable、Dictionary

时间:2022-09-03 17:56:29

前言

这里列举一些常用的集合。

正文

命名空间

C#的集合显然不止这些,还有如堆栈集合Stack、队列集合Queue等。这里只是

C#中的集合统一放在 System.Collections命名空间下,其中包含了如ArrayList、Hashtable等类型。
在System.Collections下有一个命名空间System.Collections.Generic,单词Generic的意思是泛型,其中存放了一些泛型集合如List、Dictionary。
放置在System.Collections下的集合类型存放的值的类型是object类型,也就意味着可以存放任意类型的值如int、string、自定义类型,取出来使用的时候使用as转换就行。放置在System.Collections.Generic下的泛型集合因为使用了泛型约束,所以只能存在泛型类型的值,如

List<int> a; //只能存放int类型的值。

值得注意的是,泛型集合避免了装箱、拆箱操作,大多数情况下建议使用泛型集合。

类似数组的集合

ArrayList和List<>,其中List是List的泛型版本。数组的作用是用来保存一些值,但是数组长度一旦声明就无法改变,之所以说它们是类似数组的集合,是因为它们使用像数组一样简单,但是长度会随着存储的的个数而改变。

哈希表键值对集合

Hashtable、Dictionary。Dictionary是Hashtable的泛型版本。
键值对集合是使用了哈希表进行存储的。
普通的集合,只存储值,查找时一个个取出判断是否相等。但是哈希表则不同,是保存key-value键值对,哈希表保存key-value的时候,会使用一个算法,根据key计算出一个空间地址,然后把这个value放到这个地址空间中,当要通过key取出value时,再使用这个算法计算出地址空间,直接访问这个地址空间取出值即可。哈希表查找值的过程与普通只存储value的集合相比,省去了一个个取出再进行对比的过程,更加高效。对于海量数据而言哈希表有着巨大优势。
其中值得注意的是Hashtable和Dictionary的遍历

  var ht = new Hashtable();
var user = new User { Id = 1, Name = "li" };
// Hashtable键值都是object类型,所以可以保存自定义User
ht.Add(1, user);

// 遍历键
foreach(object key in ht.Keys)
{
Console.WriteLine(key);
}
// 遍历值
foreach(var value in ht.Values)
{
Console.WriteLine(value);
}
// 遍历键值对
foreach (DictionaryEntry kv in ht)
{
Console.WriteLine("键:"+kv.Key+"值:"+kv.Value);
}


// Dictionary遍历键值对
var dic = new Dictionary<string, int>();

foreach (var item in dic)
{
Console.WriteLine(item.Key + item.Value);
}

在遍历键值对时,Hashtable并没有使用var而是使用DictionaryEntry,这是因为var会自动推断变量类型,Hashtable保存的都是object类型,而object类型是没有key、value属性的,但是Dictionary的foreach遍历却可以使用var。

其它集合

堆栈集合stack、stack<>
队列集合queue、queue<>
Hashset<>,保存不重复、无序的值。