文章大纲
加载中...

C#教程7:数组和集合

4/13/2025 146 阅读
C#教程7:数组和集合

一、数组基础

数组是一种存储相同类型元素的固定大小的顺序集合。

1.1 数组的声明与初始化

// 声明数组
int[] numbers; // 声明一个整型数组,但未分配内存

// 初始化数组
numbers = new int[5]; // 创建一个包含5个整数的数组,默认值为0

// 声明并初始化
int[] scores = new int[3] { 90, 85, 95 }; // 指定大小
int[] points = new int[] { 10, 20, 30 }; // 不指定大小
int[] values = { 1, 2, 3, 4, 5 }; // 简化语法

1.2 访问数组元素

// 创建并初始化数组
string[] fruits = { "苹果", "香蕉", "橙子", "葡萄", "西瓜" };
// 访问单个元素
Console.WriteLine($"第一个水果是: {fruits[0]}"); // 输出: 苹果
// 修改数组元素
fruits[1] = "芒果";
Console.WriteLine($"修改后的第二个水果是: {fruits[1]}"); // 输出: 芒果
// 获取数组长度
Console.WriteLine($"水果数组的长度是: {fruits.Length}"); // 输出: 5
// 遍历数组
Console.WriteLine("所有水果:");
for (int i = 0; i < fruits.Length; i++)
{
    Console.WriteLine($"  {i+1}. {fruits[i]}");
}
// 使用foreach遍历
Console.WriteLine("使用foreach遍历:");
foreach (string fruit in fruits)
{
    Console.WriteLine($"  {fruit}");
}

1.4 数组的常用方法

int[] numbers = { 23, 12, 86, 45, 9, 34, 75 };  
// 排序
Array.Sort(numbers);
Console.WriteLine("排序后的数组:");
foreach (int num in numbers)
{
    Console.Write($"{num} ");
} // 输出: 9 12 23 34 45 75 86
Console.WriteLine();

// 反转
Array.Reverse(numbers);
Console.WriteLine("反转后的数组:");
foreach (int num in numbers)
{
    Console.Write($"{num} ");
} // 输出: 86 75 45 34 23 12 9
Console.WriteLine();   
// 查找元素
int index = Array.IndexOf(numbers, 45);
Console.WriteLine($"元素45的索引是: {index}"); // 输出: 2

二、集合类型

2.1 List - 动态数组

List是一个可调整大小的数组,可以动态添加和删除元素。

using System;
using System.Collections.Generic;
// 创建List
List<string> cities = new List<string>();
// 添加元素
cities.Add("北京");
cities.Add("上海");
cities.Add("广州");
cities.Add("深圳");
// 访问元素
Console.WriteLine($"第一个城市: {cities[0]}");
// 插入元素
cities.Insert(2, "杭州"); // 在索引2处插入"杭州"
// 移除元素
cities.Remove("广州"); // 移除特定元素
cities.RemoveAt(0);   // 移除索引0处的元素
// 检查元素是否存在
bool contains = cities.Contains("上海");
Console.WriteLine($"列表包含上海: {contains}"); 
// 获取列表大小
Console.WriteLine($"城市数量: {cities.Count}");
// 使用Find方法查找元素
// Find方法接受一个谓词(Predicate)作为参数,返回第一个满足条件的元素
string foundCity = cities.Find(city => city.StartsWith("上"));
Console.WriteLine($"找到以'上'开头的城市: {foundCity}"); // 输出: 上海   
// 使用FindAll方法查找所有满足条件的元素
List<string> southCities = cities.FindAll(city => city.Length > 2);
Console.WriteLine("所有名称长度大于2的城市:");
foreach (string city in southCities)
{
    Console.WriteLine($"  {city}");
}  
// 遍历列表
Console.WriteLine("所有城市:");
foreach (string city in cities)
{
    Console.WriteLine($"  {city}");
} 
// 清空列表
cities.Clear();
Console.WriteLine($"清空后的城市数量: {cities.Count}");

2.2 Dictionary<TKey, TValue> - 键值对集合

Dictionary存储键值对,可以通过键快速查找值。

using System;
using System.Collections.Generic;

class DictionaryDemo
{
    static void Main()
    {
        // 创建字典
        Dictionary<string, int> ages = new Dictionary<string, int>();
        
        // 添加键值对
        ages.Add("张三", 25);
        ages.Add("李四", 30);
        ages.Add("王五", 22);
        
        // 另一种添加方式
        ages["赵六"] = 28;
        
        // 修改值
        ages["张三"] = 26;
        
        // 访问值
        Console.WriteLine($"张三的年龄: {ages["张三"]}");
        
        // 安全访问 - 检查键是否存在
        if (ages.ContainsKey("刘七"))
        {
            Console.WriteLine($"刘七的年龄: {ages["刘七"]}");
        }
        else
        {
            Console.WriteLine("字典中没有刘七的信息");
        }
        
        // 使用TryGetValue安全获取值
        if (ages.TryGetValue("王五", out int age))
        {
            Console.WriteLine($"王五的年龄: {age}");
        }
        
        // 移除键值对
        ages.Remove("李四");
        
        // 遍历字典
        Console.WriteLine("所有人的年龄:");
        foreach (KeyValuePair<string, int> pair in ages)
        {
            Console.WriteLine($"  {pair.Key}: {pair.Value}岁");
        }
        
        // 只遍历键
        Console.WriteLine("所有人的名字:");
        foreach (string name in ages.Keys)
        {
            Console.WriteLine($"  {name}");
        }
        
        // 只遍历值
        Console.WriteLine("所有人的年龄值:");
        foreach (int value in ages.Values)
        {
            Console.WriteLine($"  {value}岁");
        }
    }
}

三、实际应用案例

3.1 学生成绩管理系统

using System;
using System.Collections.Generic;
using System.Linq;

class Student
{
    public string Name { get; set; }
    public int ID { get; set; }
    public Dictionary<string, int> Scores { get; set; }
    
    public Student(string name, int id)
    {
        Name = name;
        ID = id;
        Scores = new Dictionary<string, int>();
    }
    
    public void AddScore(string subject, int score)
    {
        if (Scores.ContainsKey(subject))
            Scores[subject] = score;
        else
            Scores.Add(subject, score);
    }
    
    public double GetAverageScore()
    {
        if (Scores.Count == 0)
            return 0;
            
        return Scores.Values.Average();
    }
    
    public void DisplayScores()
    {
        Console.WriteLine($"{Name}的成绩单:");
        foreach (var score in Scores)
        {
            Console.WriteLine($"  {score.Key}: {score.Value}");
        }
        Console.WriteLine($"  平均分: {GetAverageScore():F2}");
    }
}

class StudentManagementSystem
{
    static void Main()
    {
        // 创建学生列表
        List<Student> students = new List<Student>();
        
        // 添加学生
        Student student1 = new Student("张三", 1001);
        student1.AddScore("数学", 85);
        student1.AddScore("语文", 92);
        student1.AddScore("英语", 78);
        students.Add(student1);
        
        Student student2 = new Student("李四", 1002);
        student2.AddScore("数学", 92);
        student2.AddScore("语文", 85);
        student2.AddScore("英语", 90);
        students.Add(student2);
        
        // 显示所有学生信息
        Console.WriteLine("所有学生信息:");
        foreach (Student student in students)
        {
            student.DisplayScores();
            Console.WriteLine();
        }
        
        // 查找特定学生
        int searchId = 1002;
        Student foundStudent = students.Find(s => s.ID == searchId);
        if (foundStudent != null)
        {
            Console.WriteLine($"找到ID为{searchId}的学生:");
            foundStudent.DisplayScores();
        }
        
        // 计算班级平均分
        double classAverage = students.Average(s => s.GetAverageScore());
        Console.WriteLine($"\n班级平均分: {classAverage:F2}");
    }
}

四、总结

  1. 数组是固定大小的相同类型元素集合,适用于已知元素数量的场景。

    • 声明方式:type[] arrayName = new type[size];
    • 优点:访问速度快
    • 缺点:大小固定,不能动态调整
  2. **List**是动态数组,可以根据需要调整大小。

    • 声明方式:List<type> listName = new List<type>();
    • 常用方法:Add(), Insert(), Remove(), RemoveAt(), Contains(),Find()
    • 优点:大小可变,操作方便
  3. **Dictionary<TKey, TValue>**是键值对集合,通过键快速查找值。

    • 声明方式:Dictionary<keyType, valueType> dictName = new Dictionary<keyType, valueType>();
    • 常用方法:Add(), Remove(), ContainsKey(), TryGetValue()
    • 优点:查找速度快,适合需要通过唯一标识符查找数据的场景

五、练习题

  1. 创建一个程序,使用数组存储5个整数,然后计算它们的平均值。

  2. 创建一个通讯录程序,使用Dictionary存储联系人姓名和电话号码,实现添加、查找和删除联系人的功能。

  3. 创建一个简单的待办事项管理程序,使用List存储待办事项,实现添加、完成和显示待办事项的功能。


评论 (0)

暂无评论,来发表第一条评论吧!