我正在使用Visual C#.NET,並且正在製作使用winforms的應用程序。我基本上需要以字符串的形式打開多個文件,並在各個地方操作數據,而不將信息保存迴文件。我如何去存儲這些數據,以便我可以在我的代碼的各個部分使用它?C#並將數據存儲在內存中
回答
爲什麼要打開它們「as strings」? .NET中的字符串是不可改變的,所以如果你做了很多改變,它可能會變得昂貴。正常的方法將是解析/反序列化數據伸到對象模型,並傳遞對象模型到您的形式 - 即
MyModel model = MyModel.Load(path);
MyForm form = new MyForm();
form.Model = model;
或相似。那麼你的表格可訪問性模型:
captionTextBox.Text = model.Title; // etc
或使用數據綁定,如果你真的想:
captionTextBox.DataBindings.Add("Text", model, "Title");
(這將使1路或2路的結合,這取決於是否您的模型還提供更改通知)
創建一個包含文件字符串作爲公共屬性的單例,並使公共屬性成爲單例。
它會工作(至少直到你有多個線程),但過度使用單身通常是在路上的設計問題的標誌... – 2010-01-29 20:41:51
確保你創建一個單身而不是* S * ingleton。 http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/ – dss539 2010-01-29 20:44:34
有什麼理由認爲單身人士被濫用?猜測什麼可能導致問題的應用程序的上下文我們一無所知似乎相當似是而非。 – 2010-01-29 20:45:50
我可能會使用一個靜態類,除非有你沒有提到的其他要求。
public static class MyFilesAsStrings
{
public static String FirstFile {get;set;}
public static LoadData()
{
FirstFile = System.IO.File.ReadAllText(@"C:\Temp\MyFile.dat");
// and so on
}
}
您可以採取多種方法。
如果這些文件是小到中等大小,則可以將內容加載到StringBuilder
或StringWriter
,並將它們存儲在由文件名索引的Dictionary
中。
如果文件很大,可以這樣做,但您可能需要考慮在處理臨時文件時將StringWriter
的內容保存爲臨時文件,並根據需要從臨時文件重新加載。
如果文件很大,您只能從文件中讀取部分或頁面,並以與小文件相同的方式管理這些文件,但磁盤上每個文件都會有很多文件,因此您可能會將它們存儲在List
或類似的地方。
總是有「複製到臨時文件編輯然後複製回來」的方法。簡單,容易和有效,即使它使用磁盤很多。
我不確定我是否明白單身人士在這種情況下會給你什麼,除了確保你沒有多個字符串的副本。它沒有幫助修改字符串本身。
我讀到你的問題的方式是對內存中字符串的操縱(不寫回文件)是至關重要的。基於此,有兩個主要選項,StringBuilder和MemoryStream。
StringBuilder是專門設計用來讓你有效地修改或附加到表示爲字符串的數據。如果該文件不太大以至於無法放入內存,則StringBuilder是最佳選擇。
您只需將文件的內容傳遞給StringBuilder構造函數即可。然後利用Append(),Insert(),Remove(),Replace()或索引器[]等方法根據需要修改字符串數據。 Stringbuilder確保這些操作比標準字符串上的操作更有效。
您也可以將文件加載到MemoryStream,然後使用StringReader(或StringWriter)獲取類似於接口(Read(),Peek(),ReadLine()等的Stream)操作字符串。
這比StringBuilder的工作多一點,但如果Stream風格的方法更適合您的應用程序,可能會優先考慮。
除非你有更具體的問題,你可能正在尋找單身模式。 – 2010-01-29 20:39:03
定義「我的代碼的各個部分」。以不同的形式,從一個類庫中的不同地方調用,?? – 2010-01-29 20:51:50