C#中的集合

集合的介绍

在C#中,集合是存储多个项的数据结构,这些项可以是相同类型或不同类型。C#提供了多种内置集合类型,用于不同的场景和需求。以下是一些常用的集合类型:

  1. 数组(Array)

    • 固定大小的元素序列。

    • 声明时必须指定大小和类型。

    • 例如:int[] numbers = new int[10];

  2. 列表(List<T>)

    • 动态数组,可以根据需要自动调整大小。

    • 允许存储重复的元素。

    • 提供快速的索引访问。

    • 例如:List<int> numbers = new List<int>();

  3. 字典(Dictionary<TKey, TValue>)

    • 基于键值对的集合,每个元素都包含一个键和一个值。

    • 键必须是唯一的,而值则不必。

    • 提供快速的查找速度。

    • 例如:Dictionary<string, int> ageDict = new Dictionary<string, int>();

  4. 队列(Queue<T>)

    • 先进先出(FIFO)的数据结构。

    • 通常用于任务调度和线程同步。

    • 例如:Queue<string> queue = new Queue<string>();

  5. 栈(Stack<T>)

    • 后进先出(LIFO)的数据结构。

    • 通常用于处理具有最后进先出需求的数据。

    • 例如:Stack<int> stack = new Stack<int>();

  6. 集合(HashSet<T>)

    • 包含不重复元素的集合。

    • 提供快速的添加、删除和查找操作。

    • 例如:HashSet<int> numbers = new HashSet<int>();

  7. 排序列表(SortedList<TKey, TValue>)

    • 元素按键排序的字典。

    • 可以按顺序遍历键和值。

    • 例如:SortedList<string, double> sortedScores = new SortedList<string, double>();

  8. 位数组(BitArray)

    • 紧凑的数组,用于表示位(true/false)值。

    • 适合于需要存储大量布尔值的场景。

    • 例如:BitArray bits = new BitArray(32);

  9. 泛型集合

    • C# 2.0引入了泛型集合,如List<T>Dictionary<TKey, TValue>等,它们允许在编译时检查类型安全。
  10. 非泛型集合

    • 泛型出现之前的集合类型,如ArrayListHashtable等,它们不提供编译时类型安全检查。
  11. 可空集合

    • 允许集合中的元素为null,例如List<int?>
  12. 只读集合

    • 一旦创建,集合的内容就不能被修改,例如通过AsReadOnly方法创建的集合。
  13. 并发集合

    • 线程安全的集合,如ConcurrentDictionary<TKey, TValue>,适合在多线程环境中使用。

List集合

List<T> 是 C# 中一个非常常用的泛型集合类,它实现了 IList<T> 接口,提供了列表(动态数组)的数据结构。以下是 List<T> 的一些主要特性和常用操作:

特性:

  • 动态数组List<T> 可以根据需要自动调整大小,这使得它非常适合在不知道具体需要多少元素时使用。

  • 索引访问:可以像数组一样通过索引访问列表中的元素。

  • 类型安全:泛型集合,确保列表中只能存储指定类型的元素。

  • 允许重复 :与 HashSet<T> 不同,List<T> 允许存储重复的元素。

  • 有序集合:元素按照添加到列表中的顺序进行排序。

常用操作:

  • 添加元素

    cs 复制代码
    List<int> numbers = new List<int>();
    numbers.Add(1); // 在列表末尾添加一个元素
    numbers.Add(2);
  • 插入元素

    cs 复制代码
    numbers.Insert(0, 0); // 在索引0的位置插入元素0
  • 移除元素

    cs 复制代码
    numbers.Remove(1); // 移除列表中的第一个元素
    numbers.RemoveAt(0); // 移除索引为0的元素
  • 访问元素

    cs 复制代码
    int firstItem = numbers[0]; // 获取索引为0的元素
  • 查找元素

    cs 复制代码
    int index = numbers.IndexOf(2); // 返回元素2的索引,如果不存在则返回-1
    bool contains = numbers.Contains(3); // 检查列表是否包含元素3
  • 遍历列表

    cs 复制代码
    foreach (int number in numbers)
    {
        Console.WriteLine(number);
    }
  • 获取子列表

    cs 复制代码
    List<int> subList = numbers.GetRange(0, 3); // 获取从索引0开始的3个元素的子列表
  • 反转列表

    cs 复制代码
    numbers.Reverse(); // 将列表中的元素顺序反转
  • 排序列表

    cs 复制代码
    numbers.Sort(); // 默认按升序排序
    // 可以提供自定义的比较器来实现自定义排序
    numbers.Sort((a, b) => a.CompareTo(b));
  • 列表转换

    cs 复制代码
    var squareList = numbers.Select(x => x * x).ToList(); // 使用LINQ将每个元素转换为平方
  • 搜索和过滤

    cs 复制代码
    var evenNumbers = numbers.Where(x => x % 2 == 0).ToList(); // 使用LINQ获取所有偶数
  • 容量和大小

    cs 复制代码
    int count = numbers.Count; // 获取列表中的元素数量
    numbers.Capacity = 100; // 设置列表的容量
  • 清空列表

    cs 复制代码
    numbers.Clear(); // 移除列表中的所有元素

List<T>System.Collections.Generic 命名空间的一部分,因此在代码中使用它时需要包含这个命名空间:

cs 复制代码
using System.Collections.Generic;

List<T> 是一个非常灵活和强大的集合类,适用于大多数需要动态数组功能的场景。

字典(Dictionary<TKey, TValue>)

Dictionary<TKey, TValue> 是 C# 中一个非常强大的泛型集合类,它存储键值对(key-value pairs),并允许通过键快速访问值。这个类实现了 IDictionary<TKey, TValue> 接口,并且位于 System.Collections.Generic 命名空间中。以下是 Dictionary<TKey, TValue> 的一些主要特性和常用操作:

特性:

  • 基于键值对:每个元素包含一个键和一个相关的值。

  • 快速查找:通过键可以快速检索、添加或删除元素。

  • 键的唯一性:字典中的键必须是唯一的,不允许重复。

  • 无序集合:字典中的元素不保持任何特定的顺序。

常用操作:

  • 初始化字典

    cs 复制代码
    Dictionary<string, int> ageDictionary = new Dictionary<string, int>();
  • 添加元素

    cs 复制代码
    ageDictionary.Add("Alice", 30);
    ageDictionary.Add("Bob", 25);
  • 访问元素

    cs 复制代码
    int age = ageDictionary["Alice"]; // 通过键获取值
  • 检查键是否存在

    cs 复制代码
    if (ageDictionary.ContainsKey("Alice"))
    {
        // 键存在
    }
  • 移除元素

    cs 复制代码
    ageDictionary.Remove("Bob"); // 移除键为"Bob"的元素
  • 遍历字典

    cs 复制代码
    foreach (KeyValuePair<string, int> pair in ageDictionary)
    {
        Console.WriteLine("Name: {0}, Age: {1}", pair.Key, pair.Value);
    }
  • 获取键和值的集合

    cs 复制代码
    var keys = ageDictionary.Keys; // 获取所有键的集合
    var values = ageDictionary.Values; // 获取所有值的集合
  • 尝试获取值

    cs 复制代码
    if (ageDictionary.TryGetValue("Alice", out int age))
    {
        Console.WriteLine($"Alice's age is {age}");
    }
  • 清空字典

    cs 复制代码
    ageDictionary.Clear(); // 移除字典中的所有元素
  • 字典初始化器

    cs 复制代码
    var dictionary = new Dictionary<string, int>
    {
        {"Alice", 30},
        {"Bob", 25}
    };
  • 查找和替换

    cs 复制代码
    if (ageDictionary.ContainsKey("Alice"))
    {
        ageDictionary["Alice"] = 31; // 更新Alice的年龄
    }
    else
    {
        ageDictionary.Add("Alice", 31); // 如果Alice不存在,添加她
    }
  • 合并字典

    cs 复制代码
    var anotherDictionary = new Dictionary<string, int>
    {
        {"Charlie", 35},
        {"David", 40}
    };
    ​
    foreach (var pair in anotherDictionary)
    {
        ageDictionary.Add(pair.Key, pair.Value);
    }
  • 使用 LINQ 查询字典

    cs 复制代码
    var query = from entry in ageDictionary
                where entry.Value > 30
                select entry;
    ​
    foreach (var pair in query)
    {
        Console.WriteLine("Name: {0}, Age: {1}", pair.Key, pair.Value);
    }

Dictionary<TKey, TValue> 是一个非常灵活的数据结构,适用于需要快速查找、添加和删除键值对的场景。使用时,应该确保键的类型重写了 GetHashCode()Equals() 方法,这样可以保证字典的正常工作。

相关推荐
IT技术分享社区5 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
△曉風殘月〆12 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風13 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_6569747417 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo17 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo19 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发19 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术19 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒20 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
平凡シンプル1 天前
C# EF 使用
c#