2012-07-11 64 views
1

我创建了一个小程序读取文本文件并基于此文本文件创建输出。什么是更有效的处理这个字符串

文本文件的例子可能是这样的:

f 
a b c 
d e 

什么我的程序也就那么要做的就是创建一个显示行,然后新建一个文本文件中的所有 组合/在每个字排列行,像这样:

f 
a b c 
a c b 
b a c 
b c a 
c b a 
c a b 
a b 
a c 
b a 
b c 
c a 
c b 
a 
b 
c 
d e 
e d 
e 
d 

我目前已经但是此功能工作正常,我决定,我要创建一个输出,除了用“〜”组合的盈/的排列一样的东西辅助文本文件每个入口提高可读性。

目前,我有这个两个outputstrings,所以可以说:

string outputStringNormal = ""; 
string outputStringReadable = ""; 

然后在我的代码,我基本上是文本添加到每个输出字符串:

outputStringNormal += someText; 
outputStringReadable += " ~ " + someText; 

我在想,如果它会更有效率,如果我只有一个输出字符串 ,我将[randomMarker]追加到每个组合/排列的开头,并在 之前输出新文本文件,在普通文件中,我将字符串替换为我的损伤ker with“”,然后在我的Readable中,我将用“〜”替换它。

所以这样的:

outputString += "[randomMarker]" + someText; 

,然后右键输出前:

CreateSomeFile(outputString.Replace("[randomMarker]", ""); 
CreateSomeFile(outputString.Replace("[randomMarker]", " ~ "); 
+0

我不认为这是一个C问题。 :P – argentage 2012-07-11 15:01:12

+1

..或C++问题。 – Jack 2012-07-11 15:02:00

+0

对不起,我只是在想,这是一个非常普遍的问题,我删除了标签。 – Eric 2012-07-11 15:04:51

回答

3

您不应该将整个文本文件存储在内存中;您应该在生成该行时将每行写出到文件中。在处理像这样的组合方法时,它很容易获得非常大的值,因此应该避免将大量不需要的信息存储在内存中。

您应该为一行生成字符串,将该行写入非人类文件,然后将~附加到人类可读文件并追加同一行。这样做你甚至不会做任何字符串连接,替换或其他任何东西。您只需不断写入输出流。

+0

这听起来像是一个很好的做法,谢谢! – Eric 2012-07-11 15:12:48

0

你成为outputStringNormal = string.Format({0} SomeText, outputStringNormal) 更多的表现在C#中的String.Format就是Concat的字符串最有效的方法。你不应该使用字符串+ =字符串。

+0

在这种情况下'StringBuilder'可以更快。 – Jack 2012-07-11 15:02:42

+0

@Jack我应该使用StringBuilder,然后替换值吗?或者使用两个字符串构建器? – Eric 2012-07-11 15:03:20

+1

@autumyst:你可以在这种情况下使用'StringBuilder':而不是:'+ ='操作符; 'String.Concat()'方法; 'String.Format()'方法。实际上,'String.Format()'方法在内部使用'StringBuilder','.AppendFormat()'方法,但是如果你不需要做它的话,'.Append()'可以快一点比AppendFormat()'。另外,为什么你将它存储在变量而不是新的文本文件('stream.Write()')? – Jack 2012-07-11 15:18:03

0

写入文件很可能是您的瓶颈。所以确保你做缓冲输出并尽可能少地刷新输出。

1

从意见移植:

您可以在此情况下使用StringBuilder:不是:

+=操作;

String.Concat()方法;

String.Format()方法。

事实上,String.Format()方法使用内部StringBuilder班,.AppendFormat()方法,但如果你不需要做formart它,可以.Append()有点比AppendFormat()更快。

另外,为什么你将它存储在变量而不是新的文本文件(streamwriter.Write())?

+0

直接写入文件将比使用stringbuilder更加减少字符串操作的开销,并且还避免了施加在内存上的压力。 – Servy 2012-07-11 15:26:07

相关问题