C# 基于二维数组实现姓名地址存储与查询功能的问题咨询
问题根因
现有代码的核心问题有两个:
- HashSet仅能实现姓名重复校验,没有存储姓名和对应地址的关联关系,无法定位到目标地址在二维数组中的下标
- 搜索逻辑直接写死了
input[1, 1],永远返回第二组录入的地址,和用户输入的检索姓名无关联,自然不会返回正确结果
最优修正方案
推荐直接用Dictionary<string, string>实现,天然支持唯一键校验+键值关联,不需要额外维护二维数组和HashSet两套存储,代码更简洁易维护:
// 初始化字典,设置大小写不敏感的姓名匹配规则 Dictionary<string, string> addressBook = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); // 录入5组数据 for (int i = 0; i < 5; i++) { while (true) { Console.Write($"Name {i + 1} : "); string name = Console.ReadLine().Trim(); // 校验姓名是否已存在 if (addressBook.ContainsKey(name)) { Console.WriteLine("Name is already added! please input a different name"); continue; } Console.Write($"Address {i + 1} : "); string address = Console.ReadLine().Trim(); addressBook.Add(name, address); break; } } // 检索逻辑 while (true) { Console.Write("\n==> Search Name : "); string searchName = Console.ReadLine().Trim(); if (addressBook.TryGetValue(searchName, out string matchedAddress)) { Console.WriteLine($"Address : {matchedAddress}"); } else { Console.WriteLine("Name cannot be found!"); } }
保留原有二维数组实现的修改方案
如果不想改动原有存储结构,只需修改检索部分的逻辑,遍历二维数组匹配姓名即可:
while(true) { Console.Write("\n==> Search Name : "); string nameSearch = Console.ReadLine(); bool isFound = false; // 遍历数组找匹配的姓名 for (int i = 0; i < input.GetLength(0); i++) { if (string.Equals(input[i, 0], nameSearch, StringComparison.OrdinalIgnoreCase)) { Console.WriteLine($"Address : {input[i, 1]}"); isFound = true; break; } } if (!isFound) { Console.WriteLine("Name cannot be found!"); } }
内容的提问来源于stack exchange,提问作者krazyne
相关产品推荐
相关产品推荐

