C#教程7:数组和集合
4/13/2025
146 阅读
一、数组基础
数组是一种存储相同类型元素的固定大小的顺序集合。
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}");
}
}
四、总结
-
数组是固定大小的相同类型元素集合,适用于已知元素数量的场景。
- 声明方式:
type[] arrayName = new type[size];
- 优点:访问速度快
- 缺点:大小固定,不能动态调整
- 声明方式:
-
**List
**是动态数组,可以根据需要调整大小。 - 声明方式:
List<type> listName = new List<type>();
- 常用方法:
Add()
,Insert()
,Remove()
,RemoveAt()
,Contains()
,Find()
- 优点:大小可变,操作方便
- 声明方式:
-
**Dictionary<TKey, TValue>**是键值对集合,通过键快速查找值。
- 声明方式:
Dictionary<keyType, valueType> dictName = new Dictionary<keyType, valueType>();
- 常用方法:
Add()
,Remove()
,ContainsKey()
,TryGetValue()
- 优点:查找速度快,适合需要通过唯一标识符查找数据的场景
- 声明方式:
五、练习题
-
创建一个程序,使用数组存储5个整数,然后计算它们的平均值。
-
创建一个通讯录程序,使用Dictionary存储联系人姓名和电话号码,实现添加、查找和删除联系人的功能。
-
创建一个简单的待办事项管理程序,使用List存储待办事项,实现添加、完成和显示待办事项的功能。
评论 (0)
暂无评论,来发表第一条评论吧!