0

我一直注意到以下代码段不适用于大文件(我认为附加到 paneContent 字符串很慢):

            string paneContent = String.Empty;
            bool lineFound = false;
            foreach (string line in File.ReadAllLines(path))
            {
                if (line.Contains(tag))
                {
                    lineFound = !lineFound;
                }
                else
                {
                    if (lineFound)
                    {
                        paneContent += line;
                    }
                }
            }
            using (TextReader reader = new StringReader(paneContent))
            {
                data = (PaneData)(serializer.Deserialize(reader));
            }

加快这一切的最佳方法是什么?我有一个看起来像这样的文件(所以我想获取两个不同标签之间的所有内容,然后反序列化所有这些内容):

A line with some tag 
A line with content I want to get into a single stream or string
A line with content I want to get into a single stream or string
A line with content I want to get into a single stream or string
A line with content I want to get into a single stream or string
A line with content I want to get into a single stream or string
A line with some tag

注意:这些标签不是 XML 标签。

4

3 回答 3

3

您可以使用 StringBuilder 而不是字符串,这就是 StringBuilder 的用途。一些示例代码如下:

var paneContent = new StringBuilder();
bool lineFound = false;
foreach (string line in File.ReadLines(path))
{
    if (line.Contains(tag))
    {
        lineFound = !lineFound;
    }
    else
    {
        if (lineFound)
        {
            paneContent.Append(line);
        }
    }
}
using (TextReader reader = new StringReader(paneContent.ToString()))
{
    data = (PaneData)(serializer.Deserialize(reader));
}

this answer中所述,当您在循环中连接时,StringBuilder 优于字符串,这里就是这种情况。

于 2013-06-04T20:47:47.557 回答
3

这是一个如何使用正则表达式的组并在之后检索其内容的示例。

您想要的是一个匹配您的标签的正则表达式,将其标记为一个组,然后检索该组的数据,如示例中所示

于 2013-06-04T20:51:30.797 回答
1

使用 aStringBuilder构建您的数据字符串 ( paneContent)。它要快得多,因为连接字符串会导致新的内存分配。StringBuilder预分配内存(如果您期望大数据字符串,您可以自定义初始分配)。

逐行读取输入文件是个好主意,这样如果您希望文件包含多行文本,就可以避免将整个文件加载到内存中。

于 2013-06-04T20:51:11.093 回答