zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C# (江湖小新)- 集合(实际开发使用频率最高的)

c#集合开发 实际 最高 频率 江湖 使用
2023-09-11 14:14:49 时间

什么是集合?

  • 集合(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语句进行保护,其效率大减。

更多**好看的内容**和**好玩的案例**请关注**我的微信公众号: 程序猿知秋**