代码翻译:重复一个字符串直到最大值

时间:2010-12-15 18:20:54

标签: c# string mono

我想知道你是否可以告诉我重复字符串的最有效方法是什么。我需要创建一个33554432字节长的字符串,重复字符串“hello,world”直到它填充该缓冲区。最好的方法是什么,在这种情况下C很容易:

for (i = 0; i < BIGSTRINGLEN - step; i += step)
        memcpy(bigstring+i, *s, step);

感谢。

5 个答案:

答案 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的子字符串来构建结果。

当然,我假设按字节表示长度。否则,您可以使用编码轻松修改上述内容,以获得您想要的字节数。