我想知道你是否可以告诉我重复字符串的最有效方法是什么。我需要创建一个33554432字节长的字符串,重复字符串“hello,world”直到它填充该缓冲区。最好的方法是什么,在这种情况下C很容易:
for (i = 0; i < BIGSTRINGLEN - step; i += step)
memcpy(bigstring+i, *s, step);
感谢。
答案 0 :(得分:3)
一种有效的方法是使用StringBuilder:
string text = "hello, world";
StringBuilder builder = new StringBuilder(BIGSTRINGLEN);
while (builder.Length + text.Length <= BIGSTRINGLEN) {
builder.Append(text);
}
string result = builder.ToString();
答案 1 :(得分:2)
首先,您希望字符串长度为33554432字节,还是字符长? .NET和C#使用16位字符,因此它们不相同。
如果你想要33554432个字符,天真的解决方案将是字符串连接。请参阅Frédéric Hamidi的回答。
如果你想要字节,你需要做一些更有趣的事情:
int targetLength = 33554432;
string filler = "hello, world";
byte[] target = new byte[targetLength];
// Convert filler to bytes. Can use other encodings here.
// I am using ASCII to match C++ output.
byte[] fillerBytes = Encoding.ASCII.GetBytes(filler);
//byte[] fillerBytes = Encoding.Unicode.GetBytes(filler);
//byte[] fillerBytes = Encoding.UTF8.GetBytes(filler);
int position = 0;
while((position + fillerBytes.Length) < target.Length)
{
fillerBytes.CopyTo(target, position);
position += fillerBytes.Length;
}
// At this point, need to possibly do a partial copy.
if (position < target.Length)
{
int bytesNecessary = target.Length - position;
Array.Copy(fillerBytes, 0, target, position, bytesNecessary);
}
答案 2 :(得分:1)
我不知道这是否是最有效的方式,但如果您使用的是.NET 3.5或更高版本,则可以使用:
String.Join("", System.Linq.Enumerable.Repeat("hello, world", 2796203).ToArray()).Substring(0, 33554432);
如果你想要的长度是动态的,那么你可以用简单的数学代替一些硬编码的数字。
答案 3 :(得分:0)
这个怎么样?将StringBuilder设置为最大预期大小,然后添加所需的字符串,只要添加另一个字符串不会超过所需的最大大小。
StringBuilder sb = new StringBuilder(33554432);
int max = sb.MaxCapacity;
String hello = "hello, world";
while (sb.Length + hello.Length <= max)
{
sb.Append(hello);
}
string longString = sb.ToString();
答案 4 :(得分:0)
这避免了重复添加字符串的循环。相反,我“加倍”字符串,直到它接近正确的长度,然后我把“加倍”的部分放在一起。
static string Repeat(string s, int length) {
if (length < s.Length) {
return s.Substring(0, length);
}
var list = new List<string>();
StringBuilder t = new StringBuilder(s);
do {
string temp = t.ToString();
list.Add(temp);
t.Append(temp);
} while(t.Length < length);
int index = list.Count - 1;
StringBuilder sb = new StringBuilder(length);
while (sb.Length < length) {
while (list[index].Length > length) {
index--;
}
if (list[index].Length <= length - sb.Length) {
sb.Append(list[index]);
}
else {
sb.Append(list[index].Substring(0, length - sb.Length));
}
}
return sb.ToString();
}
因此,例如,在输入(“Hello,world!”,64)上,我们构建字符串
13: Hello, World!
26: Hello, World!Hello, World!
52: Hello, World!Hello, World!Hello, World!Hello, World!
然后我们通过将长度为52的字符串连接到长度为13的字符串的长度为12的子字符串来构建结果。
当然,我假设按字节表示长度。否则,您可以使用编码轻松修改上述内容,以获得您想要的字节数。