C# 字典应用
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个字典,键是字符串类型,值是整数类型
Dictionary<string, int> studentScores = new Dictionary<string, int>();
// 向字典中添加键值对
// 原理:字典使用哈希表实现,键通过哈希函数转换为哈希码,用于快速查找
studentScores.Add("Alice", 85);
studentScores.Add("Bob", 92);
studentScores.Add("Charlie", 78);
// 访问字典中的值
// 原理:通过键的哈希码找到对应的桶,然后在桶中线性查找匹配的键
Console.WriteLine($"Alice's score is {studentScores["Alice"]}");
// 修改字典中的值
// 原理:通过键找到对应的值,然后更新值
studentScores["Alice"] = 88;
Console.WriteLine($"Updated Alice's score to {studentScores["Alice"]}");
// 检查字典中是否包含某个键
// 原理:通过键的哈希码找到对应的桶,然后在桶中线性查找匹配的键,返回布尔值
if (studentScores.ContainsKey("Bob"))
{
Console.WriteLine("Bob's score is in the dictionary.");
}
// 遍历字典中的所有键值对
// 原理:遍历字典的内部结构(通常是数组或链表数组),依次访问每个键值对
Console.WriteLine("All student scores:");
foreach (KeyValuePair<string, int> entry in studentScores)
{
Console.WriteLine($"Student: {entry.Key}, Score: {entry.Value}");
}
// 尝试移除字典中的某个键值对
// 原理:通过键找到对应的桶和项,然后从字典中删除该项
studentScores.Remove("Charlie");
// 检查并处理字典中不存在的键
// 原理:通过键的哈希码找到对应的桶,然后在桶中线性查找匹配的键,如果找不到则抛出异常
try
{
Console.WriteLine($"David's score is {studentScores["David"]}");
}
catch (KeyNotFoundException)
{
Console.WriteLine("David's score is not in the dictionary.");
}
// 获取字典中键的集合和值的集合
// 原理:字典维护了两个集合,一个用于键,一个用于值,直接返回这些集合的视图
Console.WriteLine("Keys in the dictionary:");
foreach (string key in studentScores.Keys)
{
Console.WriteLine(key);
}
Console.WriteLine("Values in the dictionary:");
foreach (int value in studentScores.Values)
{
Console.WriteLine(value);
}
}
}
案例应用:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个字符串数组,模拟班级中的名字列表
string[] names = { "Alice", "Bob", "Alice", "Charlie", "Bob", "David", "Alice" };
// 创建一个字典,用于存储名字和对应的出现次数
// 键(Key)是名字,值(Value)是该名字出现的次数
Dictionary<string, int> nameCounts = new Dictionary<string, int>();
// 遍历名字数组
foreach (string name in names)
{
// 检查字典中是否已包含当前名字
if (nameCounts.ContainsKey(name))
{
// 如果包含,则将当前名字对应的值(出现次数)加1
nameCounts[name]++;
}
else
{
// 如果不包含,则将当前名字添加到字典中,并将值(出现次数)设置为1
nameCounts[name] = 1;
}
}
// 遍历字典,输出每个名字及其出现的次数
foreach (KeyValuePair<string, int> entry in nameCounts)
{
Console.WriteLine($"{entry.Key}: {entry.Value}");
}
}
}
另外,如果字典中可能有多个键对应相同的值,并且你需要找到所有这些键,那么你需要遍历整个字典并收集所有匹配的键。这可以通过使用 List<T> 或其他集合类型来实现。
List<string> keysFound = nameCounts.Where(kvp => kvp.Value == valueToFind).Select(kvp => kvp.Key).ToList();
if (keysFound.Any())
{
Console.WriteLine($"Found keys for value {valueToFind}: {string.Join(", ", keysFound)}");
}
else
{
Console.WriteLine($"No keys found for value {valueToFind}.");
}