【问题标题】:C# CultureInfo.GetCultures returns an empty listC# CultureInfo.GetCultures 返回一个空列表
【发布时间】:2011-08-03 07:58:01
【问题描述】:

我不能使用 GetCultures,据我所知它返回一个空白列表。

private void AddressChooser_Load(object sender, EventArgs e)
    {
        MessageBox.Show("Form load event successfully triggered") //Debug message - This appears at runtime
        foreach (string country in GetCountryList())
        {
            MessageBox.Show(country); //Debug message - This does not appear at runtime!!
            countryBox.Items.Clear();
            countryBox.Items.Add(country);
        }
    }

    public static List<string> GetCountryList()
    {
        MessageBox.Show("Function has been triggered successfully"); //Debug message - This appears at runtime
        List<string> cultureList = new List<string>();
        CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
        foreach (CultureInfo culture in cultures)
        {
            RegionInfo region = new RegionInfo(culture.LCID);
            if (!(cultureList.Contains(region.EnglishName)))
                cultureList.Add(region.EnglishName);
            MessageBox.Show(region.EnglishName); //Debug message - This does not appear at runtime!
        }
        return cultureList;
    }

我觉得奇怪的是这不起作用,因为它只是一个复制和粘贴的 sn-p。 请帮忙! 谢谢

【问题讨论】:

  • 你是从哪里复制/粘贴的?他们也有问题。

标签: c# cultureinfo


【解决方案1】:

你一定是在某个地方的地垫下面扫了一个异常。

您的代码失败,因为CultureTypes.AllCultures &amp; ~CultureTypes.NeutralCultures 不起作用。您的列表包含中性文化和new RegionInfo() throws。

sn-p:

var c1 = CultureTypes.AllCultures & ~CultureTypes.NeutralCultures;
Console.WriteLine(c1);

产生SpecificCultures, InstalledWin32Cultures,我想那些Win32文化包含中性文化。

简单的解决方案是CultureInfo.GetCultures(CultureTypes.SpecificCultures);

但要解决的主要问题是您的异常处理和调试技术。

【讨论】:

  • 我用 CultureTypes.AllCultures 替换了 CultureTypes.AllCultures & ~CultureTypes.NeutralCultures,还尝试了 CultureTypes.SpecificCultures,但对他们中的任何一个都不满意。
  • 您在使用 AllCultures 时是否看到异常?你应该有。最好先解决这个问题。
  • 单步执行代码,可能使用 .NeutralCultures。当您创建 new Region() 时会发生什么?
  • 实际上,我决定将国家/地区的静态列表复制并粘贴到我的 ComboBoxes 项目列表中,因此我无法再访问此代码。
  • @YoshieMaster - 所以不要让它打开。亨克的答案是正确的答案。它对您不起作用的事实意味着您的程序有问题。
【解决方案2】:

首先,Debug>>Exceptions 并将 CLR Runtime Execptions 设置为 Thrown 是个好主意。其次,我认为这段代码可能是您正在寻找的:

        static void Main()
        {
            List<string> cultureList = new List<string>();
            CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
            foreach (CultureInfo culture in cultures)
            {   
                try
                {
                    RegionInfo region = new RegionInfo(culture.Name);
                    if (!(cultureList.Contains(region.EnglishName)))
                        cultureList.Add(region.EnglishName);
                    Console.WriteLine(region.EnglishName); 
                }
                catch (ArgumentException e)
                {
                    Console.WriteLine(String.Format("For{0} a specific culture name is required.", culture.Name));
                }                  
            }
        }

【讨论】:

  • 这也不返回任何东西(我将您的 Console.WriteLines 更改为 MessageBox.Shows,因为它是一个 Windows 窗体应用程序)
  • 嗯,在控制台应用程序中工作。奇怪的。只是无法在我的 Windows 窗体应用程序中工作。
  • 顺便说一下 Henk Holterman 解决方案 CultureInfo.GetCultures(CultureTypes.SpecificCultures);是一个很好的最佳实践,应该作为答案。重视努力是明智的。谢谢。
  • 但这并没有解决我的问题。
  • 哪一个是您的问题:您的 Winform 应用程序不工作或 CultureInfo.GetCultures 返回一个空列表?如果是第一个,则与您当前的问题无关。如果是第二个,我认为你在这里有必要的答案......
【解决方案3】:

在此处使用按位 or 而不是 and CultureInfo.GetCultures(CultureTypes.AllCultures &amp; ~CultureTypes.NeutralCultures);

【讨论】:

  • 那只会产生 AllCultures (7)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多