2010-01-29 24 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风格的方法更适合您的应用程序,可能会优先考虑。