Compare the Cultures area without creating RegionInfo from LCID

To list the applicable crops for this region, this is my current code:

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

But I do not like to create RegionInfoin Where.

I really want to do something:

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

But since RegionInfono LCID, I can’t. Besides a better solution, it would be interesting to know why a RegionInfodoes not LCID.

Test example:

[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 solution
            new CultureInfo("es-ES"),
            new CultureInfo("eu-ES"),
            new CultureInfo("gl-ES")
        },
        found);
}

This works for my current solution, but not for Jon's.

Two more tests, failure for a modified Jon solution (work for the original):

[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);
}
+4
source share
2 answers

, RegionInfo Name. RegionInfo LCID, CultureData, LCID.

, , ( , , , , -) .

public static class CultureInfoExtension
{
    private static readonly Dictionary<int, string> RegionNamesByLcid =
        CultureInfo.GetCultures(CultureTypes.SpecificCultures)
            .Select(c => c.LCID)
            .Distinct()
            .ToDictionary(lcid => lcid, lcid => new RegionInfo(lcid).Name);

    private static string FallbackToThrowConsistentException(CultureInfo c)
    {
        return new RegionInfo(c.LCID).Name;
    }

    public static string GetRegionName(this CultureInfo c)
    {
        string name;
        return RegionNamesByLcid.TryGetValue(c.LCID, out name)
            ? name
            : FallbackToThrowConsistentException(c);
    }
}

:

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

    private static bool CultureBelongsToRegion(CultureInfo c, RegionInfo regionInfo)
    {
        return c.GetRegionName() == regionInfo.Name;
    }
}
0

, , - (, , LCID). LCID - , .

, GB ( ) - cy-GB (1106), gd-GB (1169) en-GB (2057).

, ... Where, . string.Split, , , new RegionInfo. , , . , , , , , .

+4

Source: https://habr.com/ru/post/1606246/


All Articles