这可能是一个菜鸟问题,但我需要一些帮助。我在C#中编写了两个简单的方法: ReadCsv_IT 和 GetTranslation 。 ReadCsv_IT方法从csv文件中读取。 GetTransaltion方法调用ReadCsv_IT方法并返回已翻译的输入(字符串键)。
我的问题是,将来我将不得不请求很多次GetTranslation,但我显然不想每次都读取.csv文件。所以我在考虑使用缓存来优化我的程序的方法,这样我就不必在每次请求时都读取.csv文件。但我不知道该怎么做以及我可以做些什么来优化我的程序。有人可以帮忙吗?
public string ReadCsv_IT(string key)
{
string newKey = "";
using (var streamReader = new StreamReader(@"MyResource.csv"))
{
CsvReader csv = new CsvReader(streamReader);
csv.Configuration.Delimiter = ";";
List<DataRecord> rec = csv.GetRecords<DataRecord>().ToList();
DataRecord record = rec.FirstOrDefault(a => a.ORIGTITLE == key);
if (record != null)
{
//DOES THE LOCALIZATION with the help of the .csv file.
}
}
return newKey;
}
以下是GetTranslation方法:
public string GetTranslation(string key, string culture = null)
{
string result = "";
if (culture == null)
{
culture = Thread.CurrentThread.CurrentCulture.Name;
}
if (culture == "it-IT")
{
result = ReadCsv_IT(key);
}
return result;
}
这里也是DataRecord类。
class DataRecord
{
public string ORIGTITLE { get; set; }
public string REPLACETITLE { get; set; }
public string ORIGTOOLTIP { get; set; }
}
}
答案 0 :(得分:3)
IMO有两个选择:
将您的信息流转换为对象? 换一种说法: 创建一个类流,以便您可以引用类流的该对象。
第二
在调用GetTranslation的作用域中初始化您的流,并将其作为属性传递给GetTranslation和ReadCSV_IT。
答案 1 :(得分:1)
Brecht C和Thom Hubers已经给了你很好的建议。我想补充一点:在.NET中使用csv文件进行本地化并不是一个好主意。 Microsoft建议使用基于资源的方法(this article是一个很好的起点)。在我看来,您正在尝试为已经构建到.NET中的内容编写代码。
从翻译的角度来看,csv文件也不是最好的格式。首先,它们并不是真正标准化的:许多工具处理逗号,引号和换行符的方式略有不同,它们是翻译文本的一部分。此外,翻译人员很想在Excel中打开它们,并且 - 无需谨慎处理 - Excel将以其认为最佳的编码写出翻译。
如果您正在进行的项目是为了学习,请随时继续学习,但如果您正在开发将由客户使用,更新,翻译成多种目标语言并重新部署的软件,我建议您重新考虑你的国际化方法。
答案 2 :(得分:0)
@Brecht C是对的,用这个答案开始吧。当一个变量必须被高速缓存以供多个线程或实例使用时:当多个客户端的性能和分布出现问题时,请查看InMemoryCache或Redis。