C# 一分钟浅谈:数组与集合类的基本操作

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
可观测链路 OpenTelemetry 版,每月50GB免费额度
性能测试 PTS,5000VUM额度
简介: 【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。

引言

数组和集合类是编程中非常基础且重要的数据结构。在 C# 中,数组和集合类提供了丰富的功能,用于存储和操作数据。本文将详细介绍 C# 中数组和集合类的基本操作,并探讨一些常见的问题及其解决方法。
image.png

数组

数组是一种基本的数据结构,用于存储相同类型的元素。数组中的每个元素都有一个索引,索引从 0 开始。

创建数组

// 创建整型数组
int[] numbers = new int[5];  // 定长数组

// 初始化数组
int[] numbers = new int[] {
    1, 2, 3, 4, 5 };

常见操作

访问元素

numbers[0] = 10;  // 修改第一个元素
int first = numbers[0];  // 获取第一个元素

遍历数组

for (int i = 0; i < numbers.Length; i++) {
   
    Console.WriteLine(numbers[i]);
}

foreach (int num in numbers) {
   
    Console.WriteLine(num);
}

常见问题及解决方法

问题 1: 索引越界

访问数组时,索引超出范围会导致 IndexOutOfRangeException

解决方法
  1. 检查索引范围:确保索引在有效范围内。
  2. 使用条件语句:使用条件语句来避免越界访问。

示例代码

假设我们需要访问数组的最后一个元素,但索引越界:

using System;

class Program
{
   
    static void Main()
    {
   
        int[] numbers = new int[] {
    1, 2, 3, 4, 5 };

        try {
   
            Console.WriteLine(numbers[5]);  // 索引越界
        } catch (IndexOutOfRangeException ex) {
   
            Console.WriteLine("索引越界: " + ex.Message);
        }
    }
}

修正后的代码如下:

using System;

class Program
{
   
    static void Main()
    {
   
        int[] numbers = new int[] {
    1, 2, 3, 4, 5 };

        if (numbers.Length > 5) {
   
            Console.WriteLine(numbers[5]);
        } else {
   
            Console.WriteLine("索引越界");
        }
    }
}

问题 2: 数组长度不可变

数组一旦创建,其长度就不可改变。

解决方法
  1. 使用集合类:使用集合类(如 List<T>)来实现动态扩展。
  2. 重新分配内存:手动重新分配数组内存并复制数据。

示例代码

假设我们需要在数组末尾添加一个新元素:

using System;

class Program
{
   
    static void Main()
    {
   
        int[] numbers = new int[] {
    1, 2, 3, 4, 5 };

        int[] newNumbers = new int[numbers.Length + 1];
        Array.Copy(numbers, newNumbers, numbers.Length);
        newNumbers[newNumbers.Length - 1] = 6;

        foreach (int num in newNumbers) {
   
            Console.WriteLine(num);
        }
    }
}

集合类

集合类提供了更灵活的数据存储方式,其中最常用的是 List<T> 类。

创建集合

List<int> numbers = new List<int>();  // 动态扩展列表

常见操作

添加元素

numbers.Add(1);  // 添加单个元素
numbers.AddRange(new int[] {
    2, 3, 4 });  // 添加多个元素

访问元素

numbers[0] = 10;  // 修改第一个元素
int first = numbers[0];  // 获取第一个元素

遍历集合

for (int i = 0; i < numbers.Count; i++) {
   
    Console.WriteLine(numbers[i]);
}

foreach (int num in numbers) {
   
    Console.WriteLine(num);
}

删除元素

numbers.Remove(1);  // 移除指定元素
numbers.RemoveAt(0);  // 移除指定索引处的元素

查找元素

bool contains = numbers.Contains(1);  // 是否包含指定元素
int index = numbers.IndexOf(1);  // 获取指定元素的索引

常见问题及解决方法

问题 1: 索引越界

访问集合时,索引超出范围会导致 ArgumentOutOfRangeException

解决方法
  1. 检查索引范围:确保索引在有效范围内。
  2. 使用条件语句:使用条件语句来避免越界访问。

示例代码

假设我们需要访问集合的最后一个元素,但索引越界:

using System;
using System.Collections.Generic;

class Program
{
   
    static void Main()
    {
   
        List<int> numbers = new List<int> {
    1, 2, 3, 4, 5 };

        try {
   
            Console.WriteLine(numbers[5]);  // 索引越界
        } catch (ArgumentOutOfRangeException ex) {
   
            Console.WriteLine("索引越界: " + ex.Message);
        }
    }
}

修正后的代码如下:

using System;
using System.Collections.Generic;

class Program
{
   
    static void Main()
    {
   
        List<int> numbers = new List<int> {
    1, 2, 3, 4, 5 };

        if (numbers.Count > 5) {
   
            Console.WriteLine(numbers[5]);
        } else {
   
            Console.WriteLine("索引越界");
        }
    }
}

问题 2: 集合容量不足

当集合中的元素数量超过初始容量时,可能会导致性能下降。

解决方法
  1. 预设集合容量:在创建集合时预设容量。
  2. 使用集合类的 TrimExcess 方法:优化集合的容量。

示例代码

假设我们需要创建一个集合并添加大量元素:

using System;
using System.Collections.Generic;

class Program
{
   
    static void Main()
    {
   
        List<int> numbers = new List<int>(1000);  // 预设容量为 1000

        for (int i = 1; i <= 1000; i++) {
   
            numbers.Add(i);
        }

        Console.WriteLine("集合容量: " + numbers.Capacity);

        numbers.TrimExcess();  // 优化集合容量
        Console.WriteLine("优化后的集合容量: " + numbers.Capacity);
    }
}

示例代码:综合应用

假设我们需要实现一个简单的计算器,计算数组和列表的总和。

数组

using System;

class Program
{
   
    static int SumArray(int[] arr)
    {
   
        int sum = 0;
        foreach (int num in arr) {
   
            sum += num;
        }
        return sum;
    }

    static void Main()
    {
   
        int[] numbers = new int[] {
    1, 2, 3, 4, 5 };
        int sum = SumArray(numbers);
        Console.WriteLine("数组总和: " + sum);
    }
}

集合

using System;
using System.Collections.Generic;

class Program
{
   
    static int SumList(List<int> list)
    {
   
        int sum = 0;
        foreach (int num in list) {
   
            sum += num;
        }
        return sum;
    }

    static void Main()
    {
   
        List<int> numbers = new List<int> {
    1, 2, 3, 4, 5 };
        int sum = SumList(numbers);
        Console.WriteLine("集合总和: " + sum);
    }
}

总结

通过本文的介绍,你已经掌握了 C# 中数组和集合类的基本操作,并了解了一些常见的问题及其解决方法。正确地使用数组和集合类可以使程序逻辑更加清晰和高效。在实际编程中,要注意以下几点:

  • 数组长度固定:数组一旦创建,其长度不可改变。
  • 集合类动态扩展:集合类如 List<T> 可以动态扩展,适合存储不确定数量的元素。
  • 索引越界:访问数组或集合时,确保索引在有效范围内。
  • 预设容量:在创建集合时预设容量,提高性能。

继续深入学习 C# 的其他知识点,你将能够更加熟练地使用这门语言进行开发。

目录
相关文章
|
12天前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
14 2
|
1月前
|
C#
C#中的类和继承
C#中的类和继承
32 6
|
26天前
|
存储 C# 索引
C# 集合语法全解
C# 集合语法全解
25 0
|
26天前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
25 0
|
30天前
|
开发框架 .NET 编译器
C# 中的记录(record)类型和类(class)类型对比总结
C# 中的记录(record)类型和类(class)类型对比总结
|
3月前
|
存储 安全 C#
C# 类的深入指南
C# 类的深入指南
|
3月前
|
存储 开发框架 .NET
C#中的数组探索
C#中的数组探索
|
4月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
159 3
|
4月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
177 3
|
3天前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
18 11