C#-集合

130 阅读2分钟

1. List<T> (列表)

  • 用途: 表示可通过索引访问的对象的有序集合。它是最常用和最灵活的集合类型之一。
  • 经典例子: 存储一系列字符串,例如用户输入的姓名列表。

C#

using System;
using System.Collections.Generic;

public class ListExample
{
    public static void Main(string[] args)
    {
        // 创建一个字符串类型的 List
        List<string> names = new List<string>();

        // 添加元素
        names.Add("张三");
        names.Add("李四");
        names.Add("王五");

        // 通过索引访问元素
        Console.WriteLine($"第一个姓名: {names[0]}"); // 输出: 第一个姓名: 张三

        // 遍历列表
        Console.WriteLine("所有姓名:");
        foreach (string name in names)
        {
            Console.WriteLine(name);
        }

        // 检查列表是否包含某个元素
        bool containsLiSi = names.Contains("李四");
        Console.WriteLine($"是否包含李四: {containsLiSi}"); // 输出: 是否包含李四: True
    }
}

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

  • 用途: 表示键值对的集合。每个键在字典中必须是唯一的,通过键可以快速查找对应的值。
  • 经典例子: 存储学生的学号和姓名,通过学号快速查找学生姓名。

C#

using System;
using System.Collections.Generic;

public class DictionaryExample
{
    public static void Main(string[] args)
    {
        // 创建一个将整数(学号)映射到字符串(姓名)的 Dictionary
        Dictionary<int, string> studentNames = new Dictionary<int, string>();

        // 添加键值对
        studentNames.Add(1001, "小明");
        studentNames.Add(1002, "小红");
        studentNames.Add(1003, "小刚");

        // 通过键查找值
        if (studentNames.ContainsKey(1002))
        {
            Console.WriteLine($"学号为 1002 的学生姓名: {studentNames[1002]}"); // 输出: 学号为 1002 的学生姓名: 小红
        }

        // 遍历字典
        Console.WriteLine("所有学生信息:");
        foreach (KeyValuePair<int, string> student in studentNames)
        {
            Console.WriteLine($"学号: {student.Key}, 姓名: {student.Value}");
        }
    }
}

3. Queue<T> (队列)

  • 用途: 表示对象的先进先出 (FIFO) 集合。类似于现实生活中的排队。
  • 经典例子: 处理任务队列,例如打印队列或网络请求队列。

C#

using System;
using System.Collections.Generic;

public class QueueExample
{
    public static void Main(string[] args)
    {
        // 创建一个字符串类型的 Queue
        Queue<string> tasks = new Queue<string>();

        // 入队 (Enqueue)
        tasks.Enqueue("任务 A");
        tasks.Enqueue("任务 B");
        tasks.Enqueue("任务 C");

        Console.WriteLine("任务队列:");
        // 查看队列头部但不移除 (Peek)
        Console.WriteLine($"下一个要处理的任务: {tasks.Peek()}"); // 输出: 下一个要处理的任务: 任务 A

        // 出队 (Dequeue) 并处理任务
        while (tasks.Count > 0)
        {
            string currentTask = tasks.Dequeue();
            Console.WriteLine($"正在处理任务: {currentTask}");
        }
        // 输出:
        // 正在处理任务: 任务 A
        // 正在处理任务: 任务 B
        // 正在处理任务: 任务 C
    }
}

4. Stack<T> (栈)

  • 用途: 表示对象的后进先出 (LIFO) 集合。类似于一叠盘子。
  • 经典例子: 实现撤销/重做功能,或者在算法中进行回溯操作。

C#

using System;
using System.Collections.Generic;

public class StackExample
{
    public static void Main(string[] args)
    {
        // 创建一个整数类型的 Stack
        Stack<int> numbers = new Stack<int>();

        // 入栈 (Push)
        numbers.Push(1);
        numbers.Push(2);
        numbers.Push(3);

        Console.WriteLine("栈中的数字:");
        // 查看栈顶元素但不移除 (Peek)
        Console.WriteLine($"栈顶元素: {numbers.Peek()}"); // 输出: 栈顶元素: 3

        // 出栈 (Pop) 并处理
        while (numbers.Count > 0)
        {
            int currentNumber = numbers.Pop();
            Console.WriteLine($"弹出元素: {currentNumber}");
        }
        // 输出:
        // 弹出元素: 3
        // 弹出元素: 2
        // 弹出元素: 1
    }
}

5. HashSet<T> (哈希集合)

  • 用途: 表示唯一元素的集合。它不保证元素的顺序,并且提供了高效的元素查找、添加和删除操作。
  • 经典例子: 存储一组唯一的标签或关键词,用于去重或快速检查某个元素是否存在。

C#

using System;
using System.Collections.Generic;

public class HashSetExample
{
    public static void Main(string[] args)
    {
        // 创建一个字符串类型的 HashSet
        HashSet<string> tags = new HashSet<string>();

        // 添加元素
        tags.Add("C#");
        tags.Add(".NET");
        tags.Add("集合");
        tags.Add("C#"); // 重复添加,HashSet 会自动忽略

        Console.WriteLine("唯一的标签:");
        foreach (string tag in tags)
        {
            Console.WriteLine(tag);
        }
        // 输出 (顺序可能不同):
        // C#
        // .NET
        // 集合

        // 检查集合是否包含某个元素
        bool containsNET = tags.Contains(".NET");
        Console.WriteLine($"是否包含 .NET 标签: {containsNET}"); // 输出: 是否包含 .NET 标签: True
    }
}