如何从整数键字典中取值?求C#实现船型长度映射的优化方案
优化C#中船型到长度的映射实现
嘿,我完全懂你想要的那种优雅感——Python里用字典一行搞定的映射,到C#里总觉得写得有点啰嗦对吧?咱们来把你的代码改得更简洁、更易维护,同时保持和Python版本一样的直观性。
首先,先说说你当前代码的问题:用List<int>存船型编号,再对应长度的方式不仅冗余,查找效率也不高(List的查找是O(n)),而且没法直接和长度做关联。下面给你几种更优的实现方案,按需选择:
方案1:用Dictionary直接映射(最接近Python写法)
这是最直接的替代方案,和你Python里的字典逻辑完全对应,而且C#的Dictionary查找效率是O(1),非常高效。考虑到你的t是字符串类型,我们先做安全的类型转换:
// 定义船型编号到长度的映射,注释可以保留增强可读性 var boatLengths = new Dictionary<int, int> { { 1, 5 }, // Carrier { 2, 4 }, // Battleship { 3, 3 }, // Cruiser { 4, 3 }, // Submarine { 5, 2 } // Destroyer }; // 先把字符串类型的t转成int,再尝试获取对应长度 if (int.TryParse(t, out int boatType)) { // TryGetValue避免了"先判断存在再取值"的两次查找,更高效 return boatLengths.TryGetValue(boatType, out int length) ? length : -1; } // 如果t不是有效数字,返回-1(或者根据需求抛出异常) return -1;
如果你的t其实可以直接拿到int类型(比如AJAX返回后先转好),那代码会更简洁:
return boatLengths.TryGetValue(t, out var length) ? length : -1;
方案2:用数组实现(编号连续时的极致性能)
如果你的船型编号是连续的1-5,用数组会比Dictionary更快(数组访问是O(1)且开销更小),只需要注意索引偏移(数组从0开始):
// 索引0留空不用,索引1-5对应船型1-5的长度 int[] boatLengths = { -1, 5, 4, 3, 3, 2 }; if (int.TryParse(t, out int boatType) && boatType >= 1 && boatType <= 5) { return boatLengths[boatType]; } return -1;
这种写法非常简洁,性能也是最优的,适合编号固定连续的场景。
方案3:枚举+Dictionary(可读性拉满)
如果想要代码更具可读性,避免硬编码数字出错,不妨定义一个船型枚举,这样维护的时候一眼就能看懂每个值对应的船型:
// 先定义枚举,把船型和编号绑定 public enum BoatType { Carrier = 1, Battleship = 2, Cruiser = 3, Submarine = 4, Destroyer = 5 } // 然后定义枚举到长度的映射 var boatLengths = new Dictionary<BoatType, int> { { BoatType.Carrier, 5 }, { BoatType.Battleship, 4 }, { BoatType.Cruiser, 3 }, { BoatType.Submarine, 3 }, { BoatType.Destroyer, 2 } }; // 使用时直接解析字符串到枚举 if (Enum.TryParse<BoatType>(t, out var boatType)) { return boatLengths.TryGetValue(boatType, out int length) ? length : -1; } return -1;
这种方式的好处是代码可读性极强,后续维护时不容易写错编号,而且IDE会提供智能提示,减少出错概率。
内容的提问来源于stack exchange,提问作者Olivier Pons
相关产品推荐
相关产品推荐

