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

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
容器镜像服务 ACR,镜像仓库100个 不限时长
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 【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# 的其他知识点,你将能够更加熟练地使用这门语言进行开发。

目录
相关文章
|
2月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
125 0
|
3月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
116 8
|
1月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
36 11
|
1月前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
52 10
|
3月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
4月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
71 1
|
3月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
19 0
|
4月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
47 2
|
2月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
52 3
|
1月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
103 12