2016-05-19 41 views
0

這可能是一個noob問題,但我需要一些幫助。我用C#編寫了兩個簡單的方法:ReadCsv_ITGetTranslation。 ReadCsv_IT方法從csv文件讀取。 GetTransaltion方法調用ReadCsv_IT方法並返回已翻譯的輸入(字符串鍵)。如何在C#中緩存讀取.csv文件

我的問題是,將來我將不得不請求很多次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

兩個選項IMO:

將您的流成一個對象? 換句話說: 製作一個類流,以便您可以引用該類流的該對象。

二:

,用於GetTranslation調用範圍內初始化的流,並把它作爲GetTranslation和ReadCSV_IT的屬性。

+0

您能否詳細介紹一下?謝謝 – Devid

0

@Brecht C是對的,使用該答案開始。當一個變量必須被緩存以供多個線程或實例使用時:請看InMemoryCacheRedis當性能和分佈在多個客戶端出現問題時。

+0

我會看看InMemoryCache,看看我能否在我的程序中實現它。謝謝 – Devid

1

Brecht C和Thom Hubers已經給你提供了很好的建議。不過,我想補充一點:在.NET中使用csv文件進行本地化並不是一個好主意。微軟建議使用基於資源的方法(this article是一個很好的起點)。在我看來,你正在嘗試編寫已經內置到.NET中的東西的代碼。

從翻譯的角度來看,csv文件並不是最好的格式。首先,它們並沒有真正標準化:許多工具處理翻譯文本中逗號,引號和換行符的方式略有不同。此外,翻譯人員會試圖在Excel中打開它們,並且 - 無論如何謹慎處理,Excel將用任何它認爲最好的編碼寫出翻譯。

如果您正在開發的項目是用於學習的,請隨時繼續使用它,但是如果您正在開發將被客戶使用的軟件,已更新,翻譯成多種目標語言並重新部署,我會推薦重新考慮您的國際化方法。

+0

你是對的。但該公司反對使用資源文件,因爲他們希望在外部存儲文件。是的,Excel的編碼真的是一個痛苦的屁股。 – Devid