如何通过国家名称获取国家代码?C#代码返回null问题求助
解决通过国家名称获取RegionInfo返回null的问题
我明白你遇到的问题了——当你用"Tanzania"作为搜索关键词时,代码找不到对应的RegionInfo,返回了null。这主要有两个核心原因,咱们一步步来解决:
问题根源
RegionInfo.EnglishName的实际存储值不是短名:对于坦桑尼亚,RegionInfo的EnglishName实际是**"United Republic of Tanzania"**,虽然理论上包含"Tanzania",但string.Contains默认是区分大小写的,若搜索时的大小写与存储值不一致,就会匹配失败。SpecificCultures可能遗漏部分地区:CultureInfo.GetCultures(CultureTypes.SpecificCultures)仅返回带有特定语言绑定的地区文化(比如斯瓦希里语-坦桑尼亚的sw-TZ),部分地区可能没有对应的特定文化,导致无法被检索到。
解决方案
方案1:使用不区分大小写的匹配逻辑
修改匹配条件,忽略大小写差异,确保关键词无论大小写都能匹配:
var regions = CultureInfo.GetCultures(CultureTypes.SpecificCultures) .Select(x => new RegionInfo(x.LCID)); var selectedRegion = regions.FirstOrDefault(region => region.EnglishName.IndexOf(countryName, StringComparison.OrdinalIgnoreCase) >= 0);
方案2:改用更全面的地区数据源
如果SpecificCultures仍漏检地区,可以改用CultureTypes.AllCultures并过滤出地区相关文化,同时去重避免同一地区的多语言重复条目:
var allRegions = CultureInfo.GetCultures(CultureTypes.AllCultures) .Where(c => !c.IsNeutralCulture) .Select(c => new RegionInfo(c.LCID)) .DistinctBy(r => r.TwoLetterISORegionName); var selectedRegion = allRegions.FirstOrDefault(region => region.EnglishName.IndexOf(countryName, StringComparison.OrdinalIgnoreCase) >= 0);
方案3:维护名称映射表提升匹配可靠性
如果需要处理大量非官方短名,可以预先维护常见国家的名称映射表,直接匹配官方名称:
var countryNameMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) { {"Tanzania", "United Republic of Tanzania"}, {"USA", "United States"}, // 可根据需求添加更多映射 }; if (countryNameMap.TryGetValue(countryName, out var officialName)) { countryName = officialName; } var selectedRegion = regions.FirstOrDefault(region => region.EnglishName.Equals(countryName, StringComparison.OrdinalIgnoreCase));
验证方法
你可以先输出所有RegionInfo的名称和代码,确认目标地区的条目存在:
foreach (var region in regions) { Console.WriteLine($"{region.EnglishName} - {region.TwoLetterISORegionName}"); }
执行后你会看到坦桑尼亚的条目是United Republic of Tanzania - TZ,以此验证匹配逻辑的正确性。
内容的提问来源于stack exchange,提问作者coders
相关产品推荐
相关产品推荐

