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

2024-09-25 07:59:27 浏览数 (1)

引言

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

image.pngimage.png

数组

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

创建数组

代码语言:javascript复制
// 创建整型数组
int[] numbers = new int[5];  // 定长数组

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

常见操作

访问元素
代码语言:javascript复制
numbers[0] = 10;  // 修改第一个元素
int first = numbers[0];  // 获取第一个元素
遍历数组
代码语言:javascript复制
for (int i = 0; i < numbers.Length; i  ) {
    Console.WriteLine(numbers[i]);
}

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

常见问题及解决方法

问题 1: 索引越界

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

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

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

代码语言:javascript复制
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);
        }
    }
}

修正后的代码如下:

代码语言:javascript复制
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. 重新分配内存:手动重新分配数组内存并复制数据。
示例代码

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

代码语言:javascript复制
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> 类。

创建集合

代码语言:javascript复制
List<int> numbers = new List<int>();  // 动态扩展列表

常见操作

添加元素
代码语言:javascript复制
numbers.Add(1);  // 添加单个元素
numbers.AddRange(new int[] { 2, 3, 4 });  // 添加多个元素
访问元素
代码语言:javascript复制
numbers[0] = 10;  // 修改第一个元素
int first = numbers[0];  // 获取第一个元素
遍历集合
代码语言:javascript复制
for (int i = 0; i < numbers.Count; i  ) {
    Console.WriteLine(numbers[i]);
}

foreach (int num in numbers) {
    Console.WriteLine(num);
}
删除元素
代码语言:javascript复制
numbers.Remove(1);  // 移除指定元素
numbers.RemoveAt(0);  // 移除指定索引处的元素
查找元素
代码语言:javascript复制
bool contains = numbers.Contains(1);  // 是否包含指定元素
int index = numbers.IndexOf(1);  // 获取指定元素的索引

常见问题及解决方法

问题 1: 索引越界

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

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

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

代码语言:javascript复制
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);
        }
    }
}

修正后的代码如下:

代码语言:javascript复制
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 方法:优化集合的容量。
示例代码

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

代码语言:javascript复制
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);
    }
}

示例代码:综合应用

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

数组
代码语言:javascript复制
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);
    }
}
集合
代码语言:javascript复制
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# 的其他知识点,你将能够更加熟练地使用这门语言进行开发。

0 人点赞