如何在C#

时间:2016-05-19 21:32:12

标签: c# .net csv caching localization

这可能是一个菜鸟问题,但我需要一些帮助。我在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; }
}

}

3 个答案:

答案 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是对的,用这个答案开始吧。当一个变量必须被高速缓存以供多个线程或实例使用时:当多个客户端的性能和分布出现问题时,请查看InMemoryCacheRedis