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

如何从语言对象列表中通过非精确匹配编码获取对应ID?

解决方案:从两位语言编码匹配单字母Code获取对应Id

1. 字典映射实现(高效推荐)

如果需要频繁查询,字典的O(1)查找效率远高于遍历列表。可以根据业务场景选择静态映射或动态构建字典:

静态字典(编码固定时)

适用于语言编码不会变更的场景,直接硬编码映射关系,性能最优:

public static int GetLanguageId(this IEnumerable<Language> languages, string languageCode)
{
    var codeMap = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
    {
        {"NL", 1},
        {"EN", 2},
        {"DE", 3}
    };

    return codeMap.TryGetValue(languageCode?.Trim() ?? string.Empty, out var id) 
           ? id 
           : 0; // 找不到时返回默认值,也可按需抛出异常
}

动态构建字典(列表可能更新时)

如果Language列表是动态加载的,可以先将列表转为单字母Code到Id的映射字典,再通过输入编码的首字符匹配:

public static int GetLanguageId(this IEnumerable<Language> languages, string languageCode)
{
    // 构建单字母Code到Id的映射,忽略大小写
    var codeToIdDict = languages.ToDictionary(
        l => l.Code.ToUpperInvariant(), 
        l => l.Id, 
        StringComparer.OrdinalIgnoreCase);

    // 提取输入编码的首字符
    var targetCode = languageCode?.Trim().ToUpperInvariant().FirstOrDefault().ToString() ?? string.Empty;
    
    return codeToIdDict.TryGetValue(targetCode, out var id) ? id : 0;
}

2. 单次查询的简洁遍历实现

如果只是偶尔查询,直接遍历列表更简洁,无需额外字典开销:

public static int GetLanguageId(this IEnumerable<Language> languages, string languageCode)
{
    var targetCode = languageCode?.Trim().ToUpperInvariant().FirstOrDefault().ToString() ?? string.Empty;
    var match = languages.FirstOrDefault(l => l.Code.Equals(targetCode, StringComparison.OrdinalIgnoreCase));
    
    return match?.Id ?? 0;
}

3. 你尝试的Switch实现方式

如果语言编码数量极少且固定,Switch语法也很直观:

public static int GetLanguageId(this IEnumerable<Language> languages, string languageCode)
{
    var normalizedCode = languageCode?.Trim().ToUpperInvariant() ?? string.Empty;
    
    return normalizedCode switch
    {
        "NL" => languages.First(l => l.Code.Equals("N", StringComparison.OrdinalIgnoreCase)).Id,
        "EN" => languages.First(l => l.Code.Equals("E", StringComparison.OrdinalIgnoreCase)).Id,
        "DE" => languages.First(l => l.Code.Equals("D", StringComparison.OrdinalIgnoreCase)).Id,
        _ => 0
    };
}

注意事项

  • 加入StringComparer.OrdinalIgnoreCase处理大小写差异,避免因输入编码大小写不一致导致匹配失败
  • 找不到匹配编码时,可根据业务需求返回默认值(如0)或抛出ArgumentException异常

内容的提问来源于stack exchange,提问作者user7849697

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:10:05