2010-01-29 56 views
5

我正在使用Visual C#.NET,並且正在製作使用winforms的應用程序。我基本上需要以字符串的形式打開多個文件,並在各個地方操作數據,而不將信息保存迴文件。我如何去存儲這些數據,以便我可以在我的代碼的各個部分使用它?C#並將數據存儲在內存中

+1

除非你有更具體的問題,你可能正在尋找單身模式。 – 2010-01-29 20:39:03

+0

定義「我的代碼的各個部分」。以不同的形式,從一個類庫中的不同地方調用,?? – 2010-01-29 20:51:50

回答

0

爲什麼要打開它們「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路的結合,這取決於是否您的模型還提供更改通知)

+0

Marc,我喜歡這個建議,但是我擔心數據不能合理地解析成可預測/可用的屬性。儘管如此,對象模型仍然不需要我使用字符串作爲屬性,將數據存儲在內存中? – Brandon 2010-01-29 20:57:40

+0

同樣,你有沒有解釋這種實現的鏈接?我不是貿易的C#程序員,但需要在工作中使用它來完成這個寵物項目。 – Brandon 2010-01-29 21:05:51

+0

@Brandon數字4294967295可以存儲爲A)'string',它使用10個字節或B)'UInt32',它使用4個字節。 4 <10;) – dss539 2010-01-29 21:07:28

3

創建一個包含文件字符串作爲公共屬性的單例,並使公共屬性成爲單例。

http://msdn.microsoft.com/en-us/library/ms998558.aspx

+4

它會工作(至少直到你有多個線程),但過度使用單身通常是在路上的設計問題的標誌... – 2010-01-29 20:41:51

+0

確保你創建一個單身而不是* S * ingleton。 http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/ – dss539 2010-01-29 20:44:34

+2

有什麼理由認爲單身人士被濫用?猜測什麼可能導致問題的應用程序的上下文我們一無所知似乎相當似是而非。 – 2010-01-29 20:45:50

0

我可能會使用一個靜態類,除非有你沒有提到的其他要求。

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 
    } 
} 
+1

這將很難進行單元測試。請不要這樣做。想想孩子們! – dss539 2010-01-29 20:45:15

+0

我無法看到如何調用LoadData(),然後根據靜態類的屬性進行斷言。它將和其他任何不涉及創建單獨的DataModel類的選項一樣可測試,這將是最佳解決方案,但不回答OP的問題,它只是提供了一個不同的方法。 – Nate 2010-01-29 21:27:25

0

您可以採取多種方法。

如果這些文件是小到中等大小,則可以將內容加載到StringBuilderStringWriter,並將它們存儲在由文件名索引的Dictionary中。

如果文件很大,可以這樣做,但您可能需要考慮在處理臨時文件時將StringWriter的內容保存爲臨時文件,並根據需要從臨時文件重新加載。

如果文件很大,您只能從文件中讀取部分或頁面,並以與小文件相同的方式管理這些文件,但磁盤上每個文件都會有很多文件,因此您可能會將它們存儲在List或類似的地方。

總是有「複製到臨時文件編輯然後複製回來」的方法。簡單,容易和有效,即使它使用磁盤很多。

0

我不確定我是否明白單身人士在這種情況下會給你什麼,除了確保你沒有多個字符串的副本。它沒有幫助修改字符串本身。

我讀到你的問題的方式是對內存中字符串的操縱(不寫回文件)是至關重要的。基於此,有兩個主要選項,StringBuilder和MemoryStream。

StringBuilder是專門設計用來讓你有效地修改或附加到表示爲字符串的數據。如果該文件不太大以至於無法放入內存,則StringBuilder是最佳選擇。

您只需將文件的內容傳遞給StringBuilder構造函數即可。然後利用Append(),Insert(),Remove(),Replace()或索引器[]等方法根據需要修改字符串數據。 Stringbuilder確保這些操作比標準字符串上的操作更有效。

您也可以將文件加載到MemoryStream,然後使用StringReader(或StringWriter)獲取類似於接口(Read(),Peek(),ReadLine()等的Stream)操作字符串。

這比StringBuilder的工作多一點,但如果Stream風格的方法更適合您的應用程序,可能會優先考慮。