You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从整数键字典中取值?求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:27:18