c# - 在不从 LCID 创建 RegionInfo 的情况下比较文化区域

标签 c# cultureinfo

为了列出给定区域的适用文化,这是我当前的代码:

public IEnumerable<CultureInfo> ForRegion(RegionInfo regionInfo)
{
     return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
          .Where(c => Equals(new RegionInfo(c.LCID), regionInfo));
}

但我不喜欢在 Where 中创建一个 RegionInfo

我真的很想做这件事:

public IEnumerable<CultureInfo> ForRegion(RegionInfo regionInfo)
{
     return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
          .Where(c => c.LCID == regionInfo.LCID);
}

但由于 RegionInfo 上没有 LCID,所以我不能。除了更好的解决方案之外,了解为什么 RegionInfo 没有 LCID 会很有趣。

示例测试:

[TestMethod]
public void Can_find_all_by_region_ES_valencia()
{
    var regionInfo = new RegionInfo(new CultureInfo("ca-ES-valencia").LCID);
    List<CultureInfo> found = ForRegion(regionInfo).ToList();
    Assert.AreEqual(5, found.Count);
    CollectionAssert.AreEqual(
        new[]
        {
            new CultureInfo("ca-ES"),
            new CultureInfo("ca-ES-valencia"), //missing with Jon's solution
            new CultureInfo("es-ES"),
            new CultureInfo("eu-ES"),
            new CultureInfo("gl-ES")
        },
        found);
}

这适用于我当前的解决方案,但不适用于 Jon 的。

另外两个测试,Jon 修改后的解决方案失败(适用于原始解决方案):

[TestMethod]
public void Can_find_all_by_region_Germany()
{
    List<CultureInfo> found = ForRegion(new RegionInfo("DE")).ToList();
    Assert.AreEqual(3, found.Count);
    CollectionAssert.AreEqual(
        new[] {new CultureInfo("de-DE"), new CultureInfo("dsb-DE"), new CultureInfo("hsb-DE")}, found);
}

[TestMethod]
public void Round_trip_all_cultures()
{
    foreach (CultureInfo culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
        Assert.IsTrue(ForRegion(new RegionInfo(culture.LCID)).Contains(culture), culture.Name);
}

最佳答案

从您从查询中获得的结果来看,这应该非常明显 - 同一区域可以有多个区域设置(因此,LCID)。因此,充其量您可以获得给定区域的 LCID 列表 - 如果您想维护该列表,只需自己制作即可。

例如,区域 GB(英国)是三个不同语言环境的所在地 - cy-GB (1106)、gd-GB (1169) 和 en-GB (2057)。

就性能而言,嗯...除非您可以避免在您的 Where 中进行所有 分配,否则没有太多可调整的地方。即使是简单的 string.Split 也可能比简单地执行 new RegionInfo 花费更多。文化数据被缓存,所以在第一次之后只有与这种操作相关的内存成本。当然,如果您不介意内存成本,也没有什么可以阻止您构建自己的查找。

关于c# - 在不从 LCID 创建 RegionInfo 的情况下比较文化区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32437412/

相关文章:

c# - Culture-Invariant 区分大小写的字符串比较在不同的机器上返回不同的结果

c# - 在文本中查找 Chr(13) 并在 C# 中拆分它们

c# - 客户关系管理 2011 : How to find out the origin of a trigger for a plugin?

c# - 模型方法绑定(bind)在 xaml 中不起作用

c# - 有没有办法为整个应用程序设置文化?所有当前线程和新线程?

.net - 文化 es-DO 的默认 DateTimeFormat.ShortDatePattern 不正确

c# - 单元测试 DateTime 字符串

c# - 我们如何将 .NET CustomCulture 映射到资源文件

c# - 在插件中创建没有描述或填充的图表图像

c# - 自动刷新缓存 ASP.NET