0

我有一长串由MP4Box生成的语言及其各自的代码 ( http://pastebin.com/rn4JbTtP ) 。我想将此列表加载到 C# 中的某种键值存储中(如字典),以便用户能够从组合框中选择一种语言,并且程序将返回相应的语言代码。

有什么方法可以在每次运行程序时不读取文本文件的情况下完成?如果是这样,怎么做?

更新(如此评论)对不起,我没有清楚地解释自己。我阅读文本文件没有问题,只是当前格式需要大量解析才能输入字典。存储这些对的最佳方式是什么,以便在运行时需要最少的解析量?

4

2 回答 2

0

有什么方法可以在每次运行程序时不读取文本文件的情况下完成?

并不真地。数据需要以某种方式加载到内存中。正如@lc评论的那样,除了将字典硬编码到应用程序代码中之外,您还需要存储并阅读它。

您可以通过多种方式存储数据以供读取,但需要将其读入内存:

  • 保存到本地文本文件
  • 序列化到本地文件
  • 使用嵌入式数据库存储数据

更新:

鉴于您想以最少的解析加载本地数据,我建议您数据解析为字典后,将字典序列化到磁盘。当您从磁盘反序列化时,您将拥有一个已填充的字典实例。

于 2012-07-19T17:58:13.917 回答
0

无论如何,您都必须在应用程序启动时读取该文件。一种解决方案可能是创建一个包含您的语言的 xml 文件,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<Languages>
  <Language Name="English" Code="en"/>
  <Language Name="German" Code="de"/>
</Languages> 

你也可以有一个小类来保存语言的名称和代码,如下所示:

 class Language
    {
        public string Name { get; set; }
        public string Code { get; set; }
    }

以及阅读所有语言的阅读方法:

 private static List<Language> ReadLanguageFile()
        {
            List<Language> languages = new List<Language>();
            string path = @"LanguagesFile.xml";
            XDocument xdoc = XDocument.Load(path);
            var lans = xdoc.Root.Elements("Language");
            Language lan;
            foreach (var item in lans)
            {
                lan = new Language();
                lan.Name = item.Attribute("Name").Value;
                lan.Code = item.Attribute("Code").Value;
                languages.Add(lan);
            }
            return languages;
        }

然后您可以将您的组合框数据源绑定到语言列表,如下所示:

cmb.DataSource = ReadLanguageFile();
cmb.DisplayMember="Name";
cmb.ValueMember="Code";

现在,如果您不想为语言创建文件,您可以创建一个类来保留所有语言,如下所示:

public sealed class Languages
    {
        public static List<Language> GetLanguages()
        {
            return new List<Language>
            {
                new Language{Code="en",Name="English"},
                new Language{Code="de",Name="German"},
            };
        }
    }
于 2012-07-19T23:48:37.453 回答