我有一长串语言及其各自的代码(http://pastebin.com/rn4JbTtP),由MP4Box生成。 我想将此列表加载到C#中的某种键值存储(如字典)中,这样用户就可以从组合框中选择一种语言,程序将返回相应的语言代码。
有没有什么办法可以在每次运行程序时不读取文本文件?如果是这样,怎么样?
更新(评论为here):抱歉,我没有清楚地解释自己。我对阅读文本文件没有任何问题,只是当前格式需要大量解析才能输入字典。存储这些对的最佳方法是什么,以便在运行时需要最少量的解析?
答案 0 :(得分:0)
有没有办法在每次运行程序时不读取文本文件就可以完成?
不是真的。数据需要以某种方式加载到内存中。作为@lc commented,除了将字典硬编码到应用程序代码之外,您还需要存储并阅读它。
您可以通过多种方式存储数据以供阅读,但需要将其读入内存:
更新
看到你想用最少的解析加载本地数据,我建议你将数据解析成字典后,你{@ 3}}字典到磁盘。从磁盘反序列化时,您将拥有一个填充的字典实例。
答案 1 :(得分: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"},
};
}
}