2009-12-23 62 views
1

如果您需要能够存储大量内存的纯文本,因此它可以被搜索和编辑,你会用什么样的数据类型?存储大量文本的内存

比方说,我将一个10000行文档加载到我的C#应用​​程序中以便用LINQ进行搜索,您将如何在内存中表示它?

不是字符串,因为它有是可变的,字符串是不可变的。

+1

添加了文本,搜索和linq标记。希望这将有助于让更多专业知识的人员了解如何完成您期望的任务。 –

+0

列表是相当易变的。 –

回答

2

你总是可以使用一个MemoryStream,然后使用一个StreamReader从内存中读取数据。

你可能会从下面的链接中得到一些提示,说明如何在StreamReader中使用LINQ。我不确定它是否与你想要做的完全吻合。

http://blogs.msdn.com/ericwhite/archive/2006/08/31/linq-to-text-files.aspx

从博客文章:

StreamReader sr = new StreamReader("TextFile.txt"); 

    var t1 = 
    from line in sr.Lines() 
    let items = line.Split(',') 
    where ! line.StartsWith("#") 
    select String.Format("{0}{1}{2}", 
     items[1].PadRight(16), 
     items[2].PadRight(16), 
     items[3].PadRight(16)); 

    var t2 = 
    from line in t1 
    select line.ToUpper(); 

    foreach (var t in t2) 
    Console.WriteLine(t); 

    sr.Close(); 

你想要的StreamReader的实例更改为类似

StreamReader sr = new StreamReader(myMemoryStreamVar) 

或类似的东西。

+0

你可以用LINQ查询内存中的数据吗? –

+1

将StreamReader附加到MemoryStream时,可以使用ReadToEnd()方法将整个内存流读出为一个字符串,然后对其进行搜索。你会遇到一些问题,试图使用内置的.NET的东西来做高性能,高负载的字符串操作。自己编写搜索例程以搜索内存流可能会更好。另外,如果您正在从磁盘读取数据,则不必一次将其全部读入内存。流读取器可以从磁盘读取块中的数据以减少内存使用量。 –

+0

刚刚添加了一篇博客文章的链接,该链接描述了一种扩展方法技术,该技术允许您使用LINQ来搜索大型文本文件,而无需将整个文件加载到内存中。它使用我建议的StreamReader技术,但有一个实际的代码示例,我更新了包含的答案。这是一种使用LINQ搜索文本文件的非常简洁的方式。强烈推荐。 –

2

Stringbuilder会适合。在内部它是一个缓冲区,并且是可变的。

+1

和性能明智,这是一个可行的选择? –

+0

如果你做得很好,应该是。关键是要在stringbuilder的内部char []上进行搜索,所以你不会做大量的字符串alloc/deallocs来做搜索。这是我认为你可能会遇到的唯一问题,即由Brian提供的streamreader/memory stream选项。 –

0

StringBuilder的使用堆内存分配,这可能导致在内存不足异常在运行时。

谢谢